У меня есть следующий репозиторий 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, поэтому, когда он завершается, соединение закрывается и удаляется, но я вижу это как проблему, поскольку класс Domain Service все еще жив, и если есть второй вызовите его, он потерпит неудачу, так как хранилище уже уничтожено.
Теперь у меня есть полный контроль над всем кодом, и я хочу проектировать только грубые вызовы службы зерна, но есть кое-что во всем этом, что кажется неправильным.
Я делаю это так, чтобы избежать доменной службы, которая знает о методах OpenConnection и CloseConnection в репозитории.
Этот дизайн изначально плох или есть лучший способ сделать это?
После размышления : все дерево зависимостей генерируется на уровне WCF при поступлении запроса, и, конечно, вы можете видеть, что соединение открывается в этот момент, так как это происходит в конструкторе хранилища, поэтому Я считаю, что это не так уж плохо, так как он открыт только на время этого конкретного звонка. Правильно ли я в этом предположении или я делаю что-то ужасно плохое, открывая соединение с БД так рано?