我对StructureMap的IoC(以及一般的IoC)有点陌生。从例子来看,我的东西是这样设置的:
默认注册表:
public DefaultRegistry() {
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<IRepository>().Use<Repository>().Ctor<string>("connectionString").Is(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
//For<IExample>().Use<Example>();
}
然后,在每个控制器中,任何Action都需要数据库,我有:
private IRepository _Repository;
public TipsController(IRepository repository)
{
_Repository = repository;
}
当我需要使用它时,我只需要:
data.Information = await _Repository.GetInformationAsync();
当我使用ADO.NET时,我总是对所有内容都使用using语句。我看到了使用using语句的实体框架的例子。但是,当将EF与StutureMap结合使用时,我是否需要以某种方式将using语句包装在它周围?如果是,我该怎么办?
如果您创建了一个上下文并在单个方法的范围内使用它,则始终建议您将DbContext使用包装在using
语句中,正如您所提到的,但是,当您的DbContext生命周期不与单个方法的执行绑定时,则必须自行处理该上下文。
一种常见的模式(也是StructureMap 3文档中推荐的模式)是使用绑定到HttpContext
的嵌套容器。
这是通过在用户的Http请求开始时创建一个嵌套容器,然后在请求结束时处理嵌套容器(和DbContext实例)来实现的。
当使用ORM(如实体框架)和类似StructureMap的IoC容器时,您可以使用绑定到HTTP请求的嵌套容器来控制DbContext的生存期。因此,当请求开始时,会创建一个新的数据库连接,然后在请求结束时关闭并释放。
这可能是我发现的最完整的教程,最能描述如何设置绑定到Http请求的嵌套StructureMap容器,并且与文档中引用的StructureMap.MVC5包的操作方式几乎相同。
一旦实现了这一点,您将需要从容器中提取打开的数据库连接,并在Global.asax.cs
文件
application_endrequest
内的Http请求结束时处理它