Что плохого в том, чтобы положить Использование блоков в репозиторий? - PullRequest
3 голосов
/ 16 января 2009

Я использовал блоки в каждом методе моего хранилища. Если я хочу использовать методы перекрестных ссылок, кажется, что было бы неуместно инициализировать другой Datacontext. Что я делаю неправильно? Если я объявлю Datacontext в классе вместо использования блоков в методах, не потеряю ли я власть распоряжаться ??

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}

Ответы [ 4 ]

4 голосов
/ 17 января 2009

На самом деле, я думаю, что это семантически (или как я должен это сказать), не правильно создавать и размещать текстовые данные в вашем хранилище.

Я имею в виду: если вы открываете новое соединение с БД в каждом методе вашего хранилища, вы делаете это неправильно ИМХО. Это слишком много мелкозернистого. Класс репозитория не знает «контекста», в котором он используется. Ваш репозиторий не должен отвечать за открытие / закрытие соединений или за запуск и совершение транзакций. Контекст является королем, а хранилище не знает контекста, в котором он используется. Итак, IMHO, это ответственность уровня приложений или сервисного уровня за открытие новых объектов DataContext и их закрытие / удаление. (То же самое относится к транзакциям).

Итак, вот как я это делаю: (обратите внимание, что я не использую Entity Framework, но использую NHibernate. Я предполагаю, что класс DataContext в EF аналогичен ISession в NHibernate):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(Это не реальный выход кода; он даже не будет компилироваться, так как ISession не имеет метода Commit.;) Вместо этого StartTransaction возвращает ITransaction, который имеет какой-то метод commit, но Я думаю, вы поймете мой дрейф. ;))

3 голосов
/ 16 января 2009

Оператор использования является синтаксическим сахаром. Он компилируется в блок try / finally с вызовом Dispose () в разделе finally. Это гарантирует, что Dispose будет вызван, даже если произойдет исключение.

3 голосов
/ 16 января 2009

Если вы не используете оператор использования, вы можете распоряжаться явно. Даже если вы не избавляетесь от контекста данных, перекрестные ссылки на эти методы все равно создадут новый контекст данных. Это может или не может быть хорошей вещью, в зависимости от вашего использования. Подумайте об аспекте управления состоянием контекста данных и о том, хотите ли вы изолировать методы друг от друга или нет. Если вы хотите все время избегать создания нового контекста, перегружайте методы версиями, которые принимают контекст в качестве параметра.

Обратите внимание, что обычно не требуется для удаления контекста данных , хотя я склонен распоряжаться чем-либо, реализующим IDisposable.

2 голосов
/ 16 января 2009

Вы можете вызывать .Dispose () для класса, не используя оператор 'using' - обычно вы делаете это в методе Dispose вашего репозитория, если он у вас есть.

...