使用StructureMap IoC/Entity Framework时关闭数据库连接



我对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请求结束时处理它

最新更新