我想在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创建了一些其他文件来连接解析和嵌套容器,但为了简洁起见,我将它们排除在这个问题之外。
答案 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;集。