8

私はContext Per Requestパターンを作成するためにEF code firstMVCStructureMapのチュートリアルで、以下のようにコードを見た:は、StructureMap HttpContextScopedが必要ですか?

protected void Application_Start() 
    { 
     ... 

     initStructureMap(); 

    } 

    private static void initStructureMap() 
    { 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IUnitOfWork>().HttpContextScoped().Use(() => new Context()); 
      x.For<IFirstEntity>().Use<FirstEntity>(); 
      x.For<ISecondEntity>().Use<SecondEntity>(); 
      x.For<IThirdEntity>().Use<ThirdEntity>(); 
     }); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
    } 


public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

FirstEntitySecondEntityと...すべては自分のコンストラクタでIunitOfWorkを必要としています。

あなたはそれだけでContextない他人のために、それがReleaseAndDisposeAllHttpScopedObjects()呼び出すEndRequestイベントでHttpContextScoped()を使用して見ることができるように。

1-これは正しいアプローチですか?

2- Service layer Interfacesの場合はすべてHttpContextScoped()を使用しますか、またはIUnitOfWorkの場合のみではありませんか?例えば

x.For<IFirstEntity>().Use<FirstEntity>(); 

または

x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity()); 

、3- ReleaseAndDisposeAllHttpScopedObjects()すべてのインスタンスを配置するか、単にContextを配置しますか?

答えて

8

Webアプリケーションの規約では、httpリクエスト全体で同じORMコンテキスト/ UnitOfWorkを保持しています。これは、リクエスト中に同じエンティティを処理し、データの一貫性を維持し、行われたデータベース呼び出しを最小限に抑えるためです。 HttpContextScopedライフサイクルは、依存するすべてのインスタンスの要求中に同じUoWインスタンスが使用されることを保証します。

だから、1)はい、それは「サービス層インターフェース」の残りの部分については

正しいですが、それは全体の要求時に同じインスタンスにする必要があるかどうかに依存します。自分自身に尋ねる: "このオブジェクトの状態は、要求全体の間に必要となるでしょうか?"ほとんどの "サービス"では、そうではありません。また、「HttpContextScoped」を作成すると、そのスコープ中にすべての依存関係が維持されることにも注意してください。

これは、ほとんどの場合)2を言うために私をリードし、何

ReleaseAndDisposeAllHttpScopedObjectsHttpContextScopedに登録された容器内のすべてのオブジェクトを配置しません。デフォルトでは、オブジェクトは、Structuremapでトランジェント(呼び出しごとに新しいインスタンス)としてスコープされます。

だから3)ちょうどIUnitOfWorkインスタンスが処分されます。

+0

質問2を更新しました。 –

+0

更新された回答。同じ状態を維持する必要がある場合や、インスタンスの作成に費用がかかり、要求中に状態を共有できる場合を除き、一時オブジェクトを使用してください。 – PHeiberg

+0

ありがとう、私の問題は、これらのインスタンスが処分されるときですか?彼らはEndRequestで処分するのですか? –

関連する問題