想象一下,我有一种像下面这样的方法,它使用一些策略来创建新产品并将它们保存在 Db 中。
一切都是作为工作单元的一部分发生的。
(我的担心和)问题: 我担心将 UnitOfWork 实例作为参数传递给策略并提交根方法中的更改是否可以或可以预防?如何避免将 UnitOfWork 实例作为参数传递给策略,但仍使它们作为工作单元的一部分工作?
(我不喜欢有人可以错误地调用 .Commit 内部策略实现的事实 - 我不想要)
public void DoTheJob(CustomerRequest req)
{
var materialsPikcerStrategyFactory = new PickerStrategyFactory();
var productionStrategyFactory = new ProductionStrategyFactory();
var materialsPickerStrategy = materialsPikcerStrategyFactory.GetStrategy(req);
var productionStrategy = productionStrategyFactory.GetStrategy(req);
using (var uow = new UnitOfWorkFactory() )
{
var materials = materialsPickerStrategy.PickMaterials(req, uow);
var products = productionStrategy.CreateProductsWith(materials, uow);
uow.Commit();
}
}
puplic abstract class MaterialsPickerStrategy
{
// Picks some material entities from Db and modifies some of its properties before usage
public abstract ICollection<Material> PickMaterials(CustomerRequest req, IUnitOfWorkFactory uow);
}
public abstract class ProductionStrategy
{
// Gets the materials and creates some new instances by ADD'ing them to the repository
public abstract void CreateProductsWith (ICollection<Material> materials, IUnitOfWorkFactory uow);
}