我有以下的 ADO .Net Repository。
这里的想法是,我总是将Repository对象放入using语句中,这样当它完成时,连接就关闭并被处理了,但我认为这是个问题,因为Domain Service类仍然存在,如果有第二个调用它的情况,它将失败,因为repository已经被销毁了。
现在我完全控制所有的代码,我只想设计粗粒度的服务调用,但整个事情似乎不太对。
我这样做是为了避免Domain Service知道Repository中的OpenConnection和CloseConnection方法。
这种设计本质上是不好的,还是有更好的方法吗?
思考之后:当请求到达时,所有的依赖树都是在WCF层生成的,当然你可以看到连接在那一刻打开,因为它发生在repository的构造函数中,所以我认为这并不是很糟糕,因为它仅在此特定调用期间打开。这个假设是正确的吗?或者我在过早地打开DB连接时做了什么可怕的事情?
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语句中,这样当它完成时,连接就关闭并被处理了,但我认为这是个问题,因为Domain Service类仍然存在,如果有第二个调用它的情况,它将失败,因为repository已经被销毁了。
现在我完全控制所有的代码,我只想设计粗粒度的服务调用,但整个事情似乎不太对。
我这样做是为了避免Domain Service知道Repository中的OpenConnection和CloseConnection方法。
这种设计本质上是不好的,还是有更好的方法吗?
思考之后:当请求到达时,所有的依赖树都是在WCF层生成的,当然你可以看到连接在那一刻打开,因为它发生在repository的构造函数中,所以我认为这并不是很糟糕,因为它仅在此特定调用期间打开。这个假设是正确的吗?或者我在过早地打开DB连接时做了什么可怕的事情?
IRepository
是否与Repository
紧密耦合?也就是说,它是否包含了Find
等方法?如果是这样,那么这个接口是否意味着实现IDisposable
接口? - Lasse V. KarlsenRepository
中使用SqlConnection
?这似乎更适合于你的IUnitOfWork
。 - Steven