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