加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 是否需要StructureMap HttpContextScoped?

发布时间:2020-12-16 04:27:35 所属栏目:asp.Net 来源:网络整理
导读:我在EF代码的教程中首先看到了如下代码,MVC和StructureMap来创建Context Per Request模式: protected void Application_Start() { ... initStructureMap(); } private static void initStructureMap() { ObjectFactory.Initialize(x = { x.ForIUnitOfWork()
我在EF代码的教程中首先看到了如下代码,MVC和StructureMap来创建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,SecondEntity和……都需要在构造函数中使用IunitOfWork.

正如你所看到的那样,只使用HttpContextScoped()用于Context而不是其他用户,在EndRequest事件中它调用ReleaseAndDisposeAllHttpScopedObjects().

1-这是一个正确的方法吗?

2-我应该将HttpContextScoped()用于所有其他服务层接口,还是仅用于IUnitOfWork?例如

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

要么

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

3- ReleaseAndDisposeAllHttpScopedObjects()处理所有实例还是只处置Context?

解决方法

Web应用程序的约定是在整个http请求期间保持相同的ORM上下文/ UnitOfWork.这是为了在请求期间使用相同的实体,保持数据一致并最小化数据库调用. HttpContextScoped生命周期确保在请求所有具有依赖关系的实例期间使用相同的UoW实例.

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

关于“服务层接口”的其余部分,它取决于在整个请求期间它是否需要是同一个实例.问问自己:“在整个请求期间是否需要此对象的状态”?对于大多数“服务”而言,情况并非如此.另请注意,制作“HttpContextScoped”的内容也会使其所有依赖关系保持在该范围内.

这让我说2)在大多数情况下,没有

ReleaseAndDisposeAllHttpScopedObjects处理使用HttpContextScoped注册的容器中的所有对象.默认情况下,对象的范围是Structuremap中的瞬态(每个调用的新实例).

所以3)只会处理IUnitOfWork实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读