Asp.net mvc 3 是否需要StructureMap HttpContextScope?

Asp.net mvc 3 是否需要StructureMap HttpContextScope?,asp.net-mvc-3,entity-framework,structuremap,session-per-request,Asp.net Mvc 3,Entity Framework,Structuremap,Session Per Request,我在EF-code-first、MVC和StructureMap的教程中看到了如下代码,以创建每个请求的上下文模式: protected void Application_Start() { ... initStructureMap(); } private static void initStructureMap() { ObjectFactory.Initialize(x =>

我在
EF-code-first
MVC
StructureMap
的教程中看到了如下代码,以创建每个请求的
上下文模式:

    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;
    }
}

x.For().httpContextScope().Use(()=>newfirstEntity());

3-
release和disposeAllHttpScopedObjects()
处理所有实例或仅处理
Context

web应用程序的约定是在整个http请求期间保持相同的ORM上下文/工作单元。这是为了在请求期间使用相同的实体,保持数据的一致性,并最大限度地减少数据库调用。
HttpContextScoped
生命周期确保在请求具有依赖关系的所有实例时使用相同的UoW实例

所以1)是的,这是正确的

关于其余的“服务层接口”,这取决于在整个请求过程中是否需要相同的实例。问问自己:“在整个请求过程中是否需要此对象的状态”?对于大多数“服务”,情况并非如此。还要注意的是,使某些东西“HttpContextScope”也会使它的所有依赖项在该范围内保持不变

这让我不得不说,在大多数情况下,不会

release和disposeAllHttpScopedObjects
处理使用
HttpContextScope
注册的容器中的所有对象。默认情况下,对象在Structuremap中的作用域为瞬态(每次调用新实例)


因此3)只处理
i工作单元
实例。

更新答案。除非您需要保持相同的状态,或者实例的创建成本很高,并且可以在请求期间共享该状态,否则请使用瞬态对象。谢谢,我的问题是这些实例将在何时被处置?它们是否也在EndRequest中处置?除非您手动处置它们,或将它们固定在一个容器中,否则不会处置瞬态实例。如果需要控制注入依赖项的生存期,可能需要使用工厂方法。另一种方法是更改您的实现,这样您就不会注入一次性产品,而是注入一些包装一次性产品并控制其生命周期的产品。实际上,我的应用程序中存在内存使用率高的问题,我正在寻找检查structureMap配置的原因。
x.For<IFirstEntity>().Use<FirstEntity>();
x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity());