1

現在、Unit of Work の単一のインスタンスをコントローラーのサービス レイヤー オブジェクトに挿入しています。

public class OrderController : Controller
{
private IUnitOfWork _unitOfWork;
private IOrderService _recipeService;
private IInventoryService _inventoryService;

public OrderController(IUnitOfWork unitOfWork, IOrderService orderService, IInventoryService inventoryService)
{
    _unitOfWork = unitOfWork;
    _orderService = orderService;
    _inventoryService = inventoryService
    //Use property injection to apply the Unit of Work context and validation state to our services
    _orderService.Context = _unitOfWork;
    _inventoryService.Context = _unitOfWork;
}

理想的には、コントローラーから UoW コンテキストを削除し、登録時に UoW の有効期間を定義して、同じ UoW が HTTP 要求のスコープで使用されるようにしたいと考えています。リクエスト中にインスタンス化される各サービス オブジェクトには、Unity を介して注入された同じインスタンス UoW があります。また、コントローラーで非同期アクションを使用したいのですが、そこに影響があるかどうかはわかりません。

HierarchicalLifetimeManager の説明は私が望んでいるように聞こえますが、これを間違えるとデバッグの悪夢に終わる可能性があるため、110% 確実にしたいと考えています (参照: http://unitymvc3.codeplex.com/ )

次の登録により、望ましい動作が得られますか、それとも別の方法でアプローチする必要がありますか?

container.RegisterType<IOrderService, OrderService>();
container.RegisterType<IInventoryService, InventoryService>();
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());

ありがとう!

クリス

4

1 に答える 1

1

HierarchicalLifetimeManager は、Unity.MVC3 ソリューションの他の配管のためにのみ機能します。その LifetimeManager は、シングルトンの ContainerControlledLifetimeManager のように機能しますが、子コンテナーは、作成されたインスタンスの新しいバージョンを取得します。

Unity.MVC3 プロジェクトがそれと連携する方法は、各要求が HttpRequest.Current.Items に格納された独自の子コンテナーを作成し (UnityDependencyResolverそのプロジェクトの を参照)、要求の最後でそのコンテナーを破棄することです (これは ですRequestLifetimeHttpModule)。通常、これは、すべての ContainerControlled 登録が親から取得されることを意味しますが、すべての階層登録 (UoW など) は各子コンテナーで再作成されます。つまり、要求ごとに新しいインスタンスが作成され、要求が終了すると Dispose が続きます。

Unity.MVC3 プロジェクトの残りの部分を使用している場合は、Hierarchical LM を使用すると問題なく動作します。カスタム LifetimeManager で同じ結果を得る同様の方法があります。CodePlex のこのスレッドを参照してください。

于 2012-11-16T01:20:19.200 に答える