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