Единица работы - PullRequest
       32

Единица работы

4 голосов
/ 09 февраля 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 09 февраля 2011

Экземпляры типов, которые реализуют шаблон единицы работы, обычно имеют одного владельца, который должен контролировать его время жизни. Такие методы, как 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 предлагают вам возможность определить контекст, в котором работает объект и его зависимости. Это позволяет вам внедрить саму единицу работы и внедрить тот же экземпляр во всех его зависимостях. Это очень полезная функция, но не то, что я бы сделал в этом конкретном сценарии, потому что правильность вашего кода зависит от того, как вы настраиваете объем своей единицы работы. Это делает ваш код очень неявным, трудным для понимания и легко взломанным. IMO такая функция особенно полезна в сценариях, где потребитель не заботится о зависимости. Поэтому эта функция очень полезна для оптимизации производительности, реализации стратегий кэширования и тому подобного.

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

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

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

0 голосов
/ 07 июля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...