0

我对 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 与 StuctureMap 结合使用时,我是否需要以某种方式将 using 语句包裹起来?如果是这样,我该怎么做?

4

1 回答 1

1

如果您创建一个上下文并在单个方法的范围内使用它,那么始终建议您将 DbContext 使用包装在using您提到的语句中,但是当您的 DbContext 生命周期未绑定到单个方法的执行时,您必须自己处理上下文。

一种常见的模式(也是 StructureMap 3 文档中推荐的模式)是使用绑定到HttpContext.

这是通过在用户的 Http 请求开始时创建一个嵌套容器,然后在请求结束时处理嵌套容器(和 DbContext 实例)来实现的。

当使用 ORM(例如实体框架)和 IoC 容器(例如 StructureMap)时,您可以使用这个绑定到 HTTP 请求的嵌套容器来控制 DbContext 的生命周期。因此,当请求开始时,会创建一个新的数据库连接,然后在请求结束时关闭和处理。

可能是我发现的最完整的教程,它最好地描述了设置绑定到 Http 请求的嵌套 StructureMap 容器,并且与文档中引用的StructureMap.MVC5包的执行方式几乎相同。

一旦实现了这一点,您将需要从容器中拉出打开的数据库连接,并在application_endrequest文件Global.asax.cs中的 Http 请求结束时将其处理掉

于 2015-02-19T21:45:10.273 回答