8

EF code firstのチュートリアルで以下のようなコードを見て、パターンMVCStructureMap作成しました。Context Per Request

    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のコンストラクターが必要です。

ご覧のとおり、他のユーザーには使用HttpContextScoped()Contextず、EndRequest呼び出した場合に使用しますReleaseAndDisposeAllHttpScopedObjects()

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

2- HttpContextScoped()を他のすべてに使用しますか、それともService layer Interfaces単に使用しIUnitOfWorkますか?例えば

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

また

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

3-ReleaseAndDisposeAllHttpScopedObjects()すべてのインスタンスを破棄しますか、それとも単に破棄しContextますか?

4

1 に答える 1

8

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

だから 1) はい、それは正しいです

残りの「サービス層インターフェース」に関しては、リクエスト全体で同じインスタンスである必要があるかどうかによって異なります。「リクエスト全体でこのオブジェクトの状態が必要になるか」と自問してください。ほとんどの「サービス」では、これは当てはまりません。また、「HttpContextScoped」を作成すると、その依存関係がすべてそのスコープ内にとどまることに注意してください。

これにより、2)ほとんどの場合、いいえ

ReleaseAndDisposeAllHttpScopedObjectsで登録されたコンテナ内のすべてのオブジェクトを破棄しますHttpContextScoped。デフォルトでは、オブジェクトは Structuremap で一時的 (呼び出しごとに新しいインスタンス) としてスコープされます。

したがって、3)IUnitOfWorkインスタンスのみが破棄されます。

于 2012-12-10T10:15:19.813 に答える