moh*_*sti 8 structuremap entity-framework session-per-request asp.net-mvc-3
我在教程中看到了如下代码EF code first,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;
}
}
Run Code Online (Sandbox Code Playgroud)
FirstEntity,SecondEntity...所有需要IunitOfWork在他们的构造函数中.
正如你所看到的那样它只是HttpContextScoped()用于Context其他人而不是在EndRequest它调用的情况下ReleaseAndDisposeAllHttpScopedObjects().
1-这是一个正确的方法吗?
2-我应该将HttpContextScoped()用于所有其他Service layer Interfaces或不仅仅用于IUnitOfWork?例如
x.For<IFirstEntity>().Use<FirstEntity>();
Run Code Online (Sandbox Code Playgroud)
要么
x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity());
Run Code Online (Sandbox Code Playgroud)
3- ReleaseAndDisposeAllHttpScopedObjects()处置所有实例或只是处置Context?
Web应用程序的约定是在整个http请求期间保持相同的ORM上下文/ UnitOfWork.这是为了在请求期间使用相同的实体,保持数据一致并最小化数据库调用.的HttpContextScoped生命周期确保了其上具有相关性的所有实例的请求在相同的UOW实例使用.
所以1)是的,这是正确的
关于"服务层接口"的其余部分,它取决于在整个请求期间它是否需要是同一个实例.问问自己:"在整个请求期间是否需要此对象的状态"?对于大多数"服务"而言,情况并非如此.还要注意,制作"HttpContextScoped"的东西也会使所有它的依赖关系保持在该范围内.
这让我说2)在大多数情况下,没有
ReleaseAndDisposeAllHttpScopedObjects处理注册的容器中的所有对象HttpContextScoped.默认情况下,对象在Structuremap中作为瞬态(每个调用的新实例)作用域.
所以3)只是IUnitOfWork实例将被处置.
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |