Экземпляры типов, которые реализуют единицу работы, обычно имеют одного владельца, которому необходимо контролировать его срок службы. Методы типа 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
несколько раз допустимым сценарием, зависит от того, как вы его проектируете. В моих производственных приложениях я часто запускаю свою часть работы внутри транзакции, что позволяет мне выполнять операции с базой данных (например, для получения ключей, сгенерированных с помощью базы данных), в то же время поддерживая деловую операцию атомарной.
Надеюсь, это поможет.
Я написал сообщение в блоге о написании, подделке и введении единиц работы (используя LINQ в качестве уровня абстракции) в ваше приложение. Это может вас заинтересовать: http://bit.ly/gHLubu. – Steven