2011-02-09 2 views
4

Я ищу несколько советов о единице работы.Единица работы рисунка

Является ли фиксация на единице работы называемой несколько раз или только один раз, а затем оставляя объект для сбора мусора?

Это хорошая идея, чтобы ввести единицу работы или я должен передать ее в вызове метода при запросе объектов на выполнение какой-либо работы?

ответ

4

Экземпляры типов, которые реализуют единицу работы, обычно имеют одного владельца, которому необходимо контролировать его срок службы. Методы типа Commit, Open, Close и Dispose часто являются сильными сигналами о том, что тип должен контролироваться явно (или помещен за абстракцию, если необходимо).

По этой причине лучше ввести , а не, чтобы ввести единицу рабочего экземпляра, но ввести тип, который знает, как создать такую ​​единицу работы: фабрику.

Единица работы в этом случае функционирует как контекст, и когда другие объекты должны выполнять операции в одном и том же контексте (например, для поддержания атома атома), вам необходимо передать его. Это может выглядеть так:

public class MyCommand 
{ 
    private readonly IUnitOfWorkFactory factory; 

    public MyCommand(IUnitOfWorkFactory factory) 
    { 
     this.factory = factory; 
    } 

    public void Execute() 
    { 
     using (var context = this.factory.CreateNew()) 
     { 
      this.DoSomeNiceThings(context); 

      context.Commit(); 
     } 
    } 
} 

Многие рамки DI предлагают вам возможность определить контекст, в котором запускается объект и его зависимости. Это позволяет вам самостоятельно вводить единицу работы и вводить тот же самый экземпляр во всех его зависимостях. Это очень полезная функция, но не то, что я сделал бы в этом конкретном сценарии, потому что правильность вашего кода зависит от того, как вы настраиваете сферу своей единицы работы. Это делает ваш код очень неявным, трудно следовать и легко разбивается. ИМО такая особенность особенно полезна в сценарии, если потребитель не заботится о зависимости. Поэтому эта функция очень полезна для оптимизации производительности, реализации стратегий кэширования и т. Д.

ли совершать на единицу работы называют несколько раз или только один раз, а затем оставляя объект для сбора мусора?

Является ли вызывающий Commit несколько раз допустимым сценарием, зависит от того, как вы его проектируете. В моих производственных приложениях я часто запускаю свою часть работы внутри транзакции, что позволяет мне выполнять операции с базой данных (например, для получения ключей, сгенерированных с помощью базы данных), в то же время поддерживая деловую операцию атомарной.

Надеюсь, это поможет.

+1

Я написал сообщение в блоге о написании, подделке и введении единиц работы (используя LINQ в качестве уровня абстракции) в ваше приложение. Это может вас заинтересовать: http://bit.ly/gHLubu. – Steven

0

Идея единицы работы заключается в инкапсуляции «единицы работы», такой как все изменения, вызванные действиями в рамках одного метода (например, добавление пользователя с определенными ролями, добавление пользователя и связанные роли с пользователем).

Вы бы использовать единицу работы «партии до» этих изменений и выполнять их в один проход (обычно через сделки - потому что различные действия составляют одну единицу работы, если один не удается - все должны)

Так что, действительно, вы будете называть только один раз за единицу работы. Большинство ORM/s, таких как сущность framework/nhibernate, позволяют выполнять несколько коммитов через единую единицу работы, каждая из которых связана с конкретной транзакцией, представляющей единицу работы.

Смежные вопросы