如何使用StructureMap和WebApi2注入dbcontext

时间:2017-06-08 18:14:08

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

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

以下代码似乎具有每个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创建了一些其他文件来连接解析和嵌套容器,但为了简洁起见,我将它们排除在这个问题之外。

1 个答案:

答案 0 :(得分:0)

看看Mehdime DbContext范围工厂/定位器:https://github.com/mehdime/DbContextScope,他的博客上有一些失败。 (项目说明中的链接。)有更新的叉子更新到最新的EF版本。

我发现它是EF上下文的优秀工作包装单元,而不必担心直接注入或传递这些上下文。

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