Entity framework 如何使用StructureMap和WebApi2注入dbcontext
我想在WebAPI2项目中将我的dbcontext注入到我的服务中。但我有点不确定该怎么做。我已经通读了文档,但是生命周期、范围、请求、嵌套容器……这些都让我有点不确定。我根据自己的理解拼凑了以下代码。在安装Nuget包StructureMap.WebApi2之后,我继续将SM从v3更新到v4,并将SM.MVC5从v3更新到v4 下面的代码似乎达到了预期的效果,即每个http请求使用一个dbcontext(我想这就是我想要的……我对作用域非常困惑),以便在用户事务期间为所有服务共享同一个dbcontext,然后在事务(http请求)关闭时释放。但外表并不总是正确的 国际奥委会Entity framework 如何使用StructureMap和WebApi2注入dbcontext,entity-framework,dependency-injection,asp.net-web-api2,structuremap,dbcontext,Entity Framework,Dependency Injection,Asp.net Web Api2,Structuremap,Dbcontext,我想在WebAPI2项目中将我的dbcontext注入到我的服务中。但我有点不确定该怎么做。我已经通读了文档,但是生命周期、范围、请求、嵌套容器……这些都让我有点不确定。我根据自己的理解拼凑了以下代码。在安装Nuget包StructureMap.WebApi2之后,我继续将SM从v3更新到v4,并将SM.MVC5从v3更新到v4 下面的代码似乎达到了预期的效果,即每个http请求使用一个dbcontext(我想这就是我想要的……我对作用域非常困惑),以便在用户事务期间为所有服务共享同一个dbco
public static IContainer Initialize()
{
var container = new Container(_ =>
{
_.AddRegistry<DefaultRegistry>();
_.ForConcreteType<MyDbContext>().Configure.ContainerScoped();
});
DomainEvents.Initialize(container);
return container;
}}
publicstaticontainer初始化()
{
var container=新容器(=>
{
_.AddRegistry();
_.ForConcreteType().Configure.ContainerScoped();
});
初始化(容器);
返回容器;
}}
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<>));
});
}
public DefaultRegistry()
{
var mapperConfig=新的MapperConfiguration(cfg=>
{
AddProfile(new Common.Map.MapProfile());
cfg.CreateMissingTypeMaps=true;
});
var mapper=mapperConfig.CreateMapper();
For()。使用(()=>mapperConfig.CreateMapper());
For()。使用(()=>newmydbcontext());
扫描(
扫描=>
{
scan.AssemblyContainingType();
扫描。卡入总成();
scan.WithDefaultConventions();
扫描。连接到类型闭合(类型(IHandle));
});
}
Nuget package StructureMap.WebApi2创建了一些其他文件用于连接分辨率和嵌套容器,但为了简洁起见,我不考虑这些文件。看看Mehdime DbContext Scope Factory/Locator:他在他的博客上有一些内容。(项目描述中的链接。)那里有更新为最新EF版本的分叉 我发现它是EF上下文的优秀工作单元包装器,而不必担心直接注入或传递这些上下文
IoC容器和构造函数注入的问题在于,如果注册DBContext,这意味着很难在请求范围内处理工作单元之类的东西,而实际上它不是整个请求范围。DbContext作用域通过让您在容器中注册作用域工厂和作用域定位器来解决这个问题。控制作用域(工作单元)的代码将使用作用域工厂初始化DBContext的上下文作用域。在DbContext中使用dbset等进行操作的代码使用ContextScopeLocator获取其UoW/w它的DbContext&set 看看Mehdime DbContext范围工厂/定位器:他在他的博客上对它有一点了解。(项目描述中的链接。)那里有更新为最新EF版本的分叉 我发现它是EF上下文的优秀工作单元包装器,而不必担心直接注入或传递这些上下文
IoC容器和构造函数注入的问题在于,如果注册DBContext,这意味着很难在请求范围内处理工作单元之类的东西,而实际上它不是整个请求范围。DbContext作用域通过让您在容器中注册作用域工厂和作用域定位器来解决这个问题。控制作用域(工作单元)的代码将使用作用域工厂初始化DBContext的上下文作用域。在DbContext中使用dbset等进行操作的代码使用ContextScopeLocator获取其UoW/w它的DbContext&set 我以前看过一眼,但现在再看一眼。然而,我的第一反应是,由于我在一个web环境中,我的大多数使用将作为每个请求的单个uow。到目前为止,我还没有发现需要在同一请求中定义第二个dbcontext。这可能是我最终采纳的一个很好的替代建议,但不幸的是,它没有回答我关于上面代码是否正确的问题。我之前已经看过了,但将再看一看。然而,我的第一反应是,由于我在一个web环境中,我的大多数使用将作为每个请求的单个uow。到目前为止,我还没有发现需要在同一请求中定义第二个dbcontext。这可能是我最终采纳的一个很好的替代建议,但不幸的是,它未能回答我关于上面代码是否正确的问题。