【问题标题】:How to inject dbcontext with StructureMap and WebApi2如何使用 StructureMap 和 WebApi2 注入 dbcontext
【发布时间】:2017-06-08 18:14:08
【问题描述】:

我想将我的 dbcontext 注入到我在 web api 2 项目中的服务中。但我有点不确定如何做到这一点。我已经阅读了文档,但生命周期、范围、请求、嵌套容器……它们都让我有点不确定。我根据自己的最佳理解拼凑了以下代码。安装 Nuget 包 StructureMap.WebApi2 后,我继续将 SM 从 v3 更新到 v4,以及将 SM.MVC5 从 v3 更新到 v4。

以下代码似乎具有每个 http 请求使用一个 dbcontext 的预期效果(我认为这就是我想要的......我对范围很困惑)以便在用户期间为所有服务共享相同的 dbcontext事务,然后在事务(http请求)关闭时处理。但外表并不总是正确的。

IoC.cs

    public static IContainer Initialize()
    {
        var container = new Container(_ =>
        {
            _.AddRegistry<DefaultRegistry>();
            _.ForConcreteType<MyDbContext>().Configure.ContainerScoped();
        });
        DomainEvents.Initialize(container);
        return container;
    }}

DefaultRegistry.cs:

    public DefaultRegistry()
    {
        var mapperConfig = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new Common.Map.MapProfile());
            cfg.CreateMissingTypeMaps = true;
        });
        var mapper = mapperConfig.CreateMapper();
        For<IMapper>().Use(() => mapperConfig.CreateMapper());
        For<MyDbContext>().Use(()=> new MyDbContext());

        Scan(
            scan =>
            {
                scan.AssemblyContainingType<ServiceBase>();
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
                scan.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
            });
    }

Nuget 包 StructureMap.WebApi2 创建了一些其他文件来连接分辨率和嵌套容器,但为了简洁起见,我将它们排除在这个问题之外。

【问题讨论】:

    标签: entity-framework dependency-injection asp.net-web-api2 structuremap dbcontext


    【解决方案1】:

    查看 Mehdime DbContext Scope Factory / Locator:https://github.com/mehdime/DbContextScope,他在博客上对此有一些了解。 (项目描述中的链接。)那里有更新到最新 EF 版本的分支。

    我发现它是 EF 上下文的出色工作单元包装器,无需担心直接注入或传递这些上下文。

    IoC 容器和构造函数注入的问题在于,如果您注册 DBContext,这意味着如果它本质上不是请求的整个范围,就很难在请求范围内处理诸如工作单元之类的事情。 DbContext Scope 通过在容器中注册一个 Scope Factory 和一个 Scope Locator 来解决这个问题。控制范围(工作单元)的代码将使用范围工厂为您的 DbContexts 初始化上下文范围。在 DbContext 中使用 DbSets 等操作的代码使用 ContextScopeLocator 来获取它们的 UoW /w 它是 DbContext 和集合。

    【讨论】:

    • 我以前看过,但会再看一下。然而,我的第一反应是,由于我处于 Web 环境中,所以我的大部分使用将作为每个请求的单个 uow。到目前为止,我还没有发现需要在同一个请求中定义第二个 dbcontext。这可能是我最终采用的一个很好的替代建议,但不幸的是它无法回答我关于上面的代码是否正确的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2014-10-22
    相关资源
    最近更新 更多