gpt4 book ai didi

c# - 注入(inject)存储库上的 IDisposable

转载 作者:太空狗 更新时间:2023-10-29 21:09:57 25 4
gpt4 key购买 nike

我有以下 ADO .Net 存储库

public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;

public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}

public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}

此存储库通过 IoC 容器注入(inject)域服务,并像这样使用:

public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;

public UserDomainService(IRepository repository)
{
Repository = repository;
}

public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");

Repository.Add(user);
Repository.Commit();
}
}
}

我的想法是,我总是将 Repository 对象放在一个 using 语句中,这样当它完成时,连接就会关闭并被处理掉,但我认为这是一个问题,因为领域服务类仍然存在,如果有第二个调用它,它将失败,因为存储库已经被销毁。

现在我已经完全控制了所有代码,我只想设计粗粒度的服务调用,但总感觉有些不对劲。

我这样做是为了避免域服务知道存储库中的 OpenConnection 和 CloseConnection 方法。

这种设计本质上是不好的还是有更好的方法?

深思熟虑:当请求到达时,所有依赖树都在 WCF 级别生成,当然您可以看到连接在那个时刻打开,因为它发生在存储库的构造函数中所以我相信它并没有那么糟糕,因为它只在这个特定的通话期间开放。我的这个假设是正确的,还是我在流程的早期打开数据库连接做了一些非常糟糕的事情?

最佳答案

注入(inject)一个工厂来创建您需要的实例,而不是实例本身。

获取一个 IRepositoryFactory,这样您就可以创建一个 IRepository 并在每次使用时释放它。这样,域服务或工厂都不需要是一次性的。此外,重要的是,您仍然通过注入(inject)实现而不是硬编码来保持代码抽象。

public class UserDomainService : IUserDomainService
{
private readonly IRepositoryFactory RepositoryFactory;

public UserDomainService(IRepositoryFactory factory)
{
RepositoryFactory = factory;
}

public User CreateNewUser(User user)
{
using (IRepository repository = RepositoryFactory.Create())
{
var user = repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");

repository.Add(user);
repository.Commit();
}
}
}

您不必总是注入(inject)所需的类型。在阅读 CaSTLe Windsor(其思维方式是注册-解析-发布)时,您会发现如果您想在应用程序生命周期中的不确定时间解决问题,建议使用类型工厂。

您知道您将需要一个存储库,但不知道什么时候。与其请求存储库,不如请求能够创建它们的东西。因此保持了抽象级别,您没有泄漏任何实现。

关于c# - 注入(inject)存储库上的 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com