当前位置: 首页 > 编程语言 > C#

在存储库共享上注入IDisposable

时间:2023-04-11 00:24:38 C#

在存储库上注入IDisposable我有以下ADO.Net存储库私有SqlConnection连接;,connectionString){UnitOfWork=unitOfWork;Connection=newSqlConnection(connectionString);连接.打开();}publicMyObjectFindBy(stringuserName){//...Ado.Netcommand.ExecuteReader等}}Thisrepository将域服务注入IOS容器,使用以下方法:publicclassUserDomainService:IUserDomainService{privatereadonlyIRepositoryRepository;publicUserDomainService(IRepositoryrepository){Repository=repository;}publicUserCreateNewUser(Useruser){using(Repository){varuser=Repository.FindBy(user.UserName);if(user!=null)thrownewException("用户名已经存在!");存储库。添加(用户);存储库提交();我的想法是,我总是将Repository对象放在using语句中,所以当它完成时,连接将被关闭并处理掉,但我认为这是一个问题,因为领域服务类仍然存在,如果有第二个调用它,它会失败,因为因为repository已经被销毁既然我已经完全控制了所有的代码,我只想设计粗粒度的服务调用,但是感觉有些不对劲。我这样做是为了避免域服务了解存储库中的OpenConnection和CloseConnection方法。这种设计本质上是不好的还是有更好的方法来做到这一点?思来想去:当请求到来时,所有的依赖树都是在WCF级别生成的,当然你可以看到连接在那一刻打开了,因为它发生在存储库的构造函数中,所以我相信它并没有那么糟糕,因为它仅在此特定调用期间打开。我的这个假设是否正确,或者我是否通过在此过程的早期打开数据库连接来做一些非常糟糕的事情?注入一个工厂来创建您需要的实例,而不是实例本身。获取一个IRepositoryFactory以便您可以创建一个IRepository并在每次使用它时处理IRepository。这样,域服务和工厂都不需要是一次性的。此外,通过仍然注入实现而不是硬编码来保持代码的抽象性也很重要。公共类UserDomainService:IUserDomainService{privatereadonlyIRepositoryFactoryRepositoryFactory;publicUserDomainService(IRepositoryFactoryfactory){RepositoryFactory=factory;}publicUserCreateNewUser(Useruser){using(IRepositoryrepository=RepositoryFactory.user.UserName);if(user!=null)thrownewException("用户名已经存在!");存储库。添加(用户);存储库提交();您并不总是需要注入所需的类型。在阅读CastleWindsor(其思路是注册-解析-发布)时你会发现,如果你想在应用程序生命周期的不确定时间解析内容,推荐使用TypeFactories。你知道你需要一个存储库,但不知道什么时候。与其请求存储库,不如请求创建它们的东西。因此,抽象级别得到维护,您不会泄漏任何实现。您遇到的问题是所有权问题。UserDomainService类不创建IRepository,但它在处理实例时仍然拥有该实例的所有权。一般规则是创建对象的人应该销毁它。换句话说,谁创建了这个对象,谁就是拥有者,拥有者就会销毁这个对象。您的问题有两种解决方案。正如Adam明确解释的那样,创建一个IRepositoryFactory。此类工厂的CreateNewRepository()方法将清楚地传达调用者获得所有权并应处置创建的存储库。让创建(并注入)该存储库的人处理该存储库的处理。您可以在WCF服务中手动执行此操作,或使用IoC/DI框架。如果您使用的是DI框架,您应该查看每个Web请求生命周期或类似的东西。最后请注意,您的IRepository实现了IDisposable。选择解决方案2时,您可以从IRepository中删除IDisposable接口,这隐藏了应用程序接触资源的事实。从应用程序中隐藏IDisposable是一件好事,因为该接口是一个有漏洞的抽象。您已经遇到了这个问题,因为从您的应用程序内部调用Dispose会破坏整个应用程序。以上就是本次C#学习教程:InjectingIDisposable分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: