8

我在 的教程中看到了如下代码EF code firstMVCStructureMap创建了一个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;
    }
}

FirstEntity, SecondEntityand ... 都需要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 回答