いくつかの戦略を使用して新しい製品を作成し、結果として Db に永続化する、以下のような 1 つのメソッドがあるとします。
そして、すべてが Unit of Work の一部として発生します。
(私の懸念と)質問: 私の懸念は、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);
}