我有以下 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 容器注入到域服务中,并按如下方式使用:
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 级别生成,当然您可以看到连接在那一刻打开,因为它发生在存储库的构造函数中,所以我相信它并没有那么糟糕,因为它是仅在该特定通话期间打开。我的这个假设是正确的还是我在过程中这么早就打开数据库连接做了一些非常糟糕的事情?