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

时间:2015-02-19 01:04:35

标签: c# sql-server database-connection entity-framework-6 structuremap3

我对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语句?如果是这样,我该怎么办?

1 个答案:

答案 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请求结束时将其丢弃