IDisposable во внедренном репозитории

У меня есть следующий репозиторий 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 при поступлении запроса и, конечно, вы можете видеть, что соединение открывается в этот момент, так как это происходит в конструкторе репозитория, поэтому я считаю, что это не так уж плохо, так как он открыт только на время этого конкретного вызова. Я прав в этом предположении или я делаю что-то ужасно плохое, открывая соединение с БД так рано в процессе?

6
задан Sergio Romero 3 April 2012 в 14:54
поделиться