1

いくつかの戦略を使用して新しい製品を作成し、結果として 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);
}
4

2 に答える 2

1

あなたのコードは作業単位のみを使用していて、リポジトリは使用していないようです。これらは通常、問題を解決するために一緒に使用されます。リポジトリは、データベースからデータをフェッチするか、現在の作業単位に変更を登録する責任があり、作業単位は登録された変更をコミットする責任があります。これにより、リポジトリを戦略に渡すことができ、戦略は作業単位にアクセスできなくなります。

EF に関しては、 ObjectContext/DbContextは作業単位と見なすことができ、 ObjectSet/DbSetはリポジトリと見なすことができます。カスタム作業単位とカスタム リポジトリがある場合、それらはすべて単一の EF コンテキスト インスタンスを共有する必要があります。

于 2013-01-11T18:24:23.503 に答える
1

コミットを実行するために必要なクラスへの依存関係として渡す UnitOfWork があります。これは、あなたの場合、戦略になりたくない場合です。

UnitOfWork は、ある種のデータ コンテキストへの参照を持っているため、更新をコミットする方法を知っている必要があります。たぶん、エンティティ フレームワーク モデル、DBContext など。

戦略がコミットすることになっていない場合、戦略は UnitOfWork について認識すべきではありません。UnitOfWork を使用して、データ コンテキストを戦略に公開しているのかもしれません。

戦略と UnitOfWork の両方に、同じデータ コンテキストへの参照が必要です。次に、戦略はコンテキストと他のルーチンで機能します。多くの戦略を使用している可能性があり、最後にコミットするために UnitOfWork への参照があります。

IOC フレームワークを使用している場合、データ コンテキストの有効期間スコープを PerRequest として指定し、それを依存関係として両方のクラスに渡すため、これはすべて非常に簡単です。フレームワークがその依存関係をクラスに注入すると、同じインスタンスが使用されるため、戦略は作業単位によって保持される同じインスタンスに書き込まれます。このようにして、戦略を通じてデータに加えた変更は、作業単位がコミットしようとしている変更と同じです。IOC に本当に精通している場合は、特定のクラスが必要とするコンテキストの個々の部分を実際に注入して、依存関係をさらに分離することができます。

于 2013-01-11T18:21:46.940 に答える