我对StructureMap的IoC(以及一般的IoC)有点新鲜。从示例中,我的设置如下:
DefaultRegistry:
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语句的Entity Framework示例。但是,当将EF与StuctureMap结合使用时,我是否需要以某种方式包装一个using语句?如果是这样,我该怎么办?
答案 0 :(得分:1)
如果您创建一个上下文并在单个方法的范围内使用它,那么始终建议您将DbContext用法包装在using
语句中,如上所述,但是当您的DbContext生命周期未绑定到执行单个方法然后你必须自己处理上下文。
一个常见的模式(和one recommended in the StructureMap 3 documentation)是拥有绑定到HttpContext
的线束嵌套容器。
这可以通过在用户的Http请求开始时创建一个嵌套容器,然后在请求结束时处理嵌套容器(和DbContext实例)来实现。
当使用ORM(如Entity Framework)和IoC容器(如StructureMap)时,可以使用绑定到HTTP请求的嵌套容器来控制DbContext的生命周期。因此,当请求开始时,将创建一个新的数据库连接,然后在请求结束时关闭并处理它。
This可能是我发现的最完整的教程,它最好地描述了设置绑定到Http请求的嵌套StructureMap容器,并且几乎与StructureMap.MVC5包的方式相同它在文档中引用。
一旦实现了这一点,您需要从容器中提取打开的数据库连接,并在application_endrequest
文件中Global.asax.cs
内的Http请求结束时将其丢弃