C# IoC容器-仅为特定服务注入新的DbContext实例
我的C#web应用程序首先使用Entity Framework 7代码。C# IoC容器-仅为特定服务注入新的DbContext实例,c#,entity-framework,asp.net-core,inversion-of-control,C#,Entity Framework,Asp.net Core,Inversion Of Control,我的C#web应用程序首先使用Entity Framework 7代码。DbContext的范围是HTTP请求的生存期。有一个UnitOfWork类包装了这个DbContext。这将被注入到大多数需要对数据库执行Crud操作的服务中 应用程序还有一个AuditService,用于在抛出异常时审核错误。我不想将作用域为HTTP请求的DbContext注入此服务,因为如果引发异常,我只想将审核条目保存到数据库中,而忽略任何其他挂起的更改。因此,在本例中,插入UnitOfWork/DbContext的
DbContext
的范围是HTTP请求的生存期。有一个UnitOfWork
类包装了这个DbContext
。这将被注入到大多数需要对数据库执行Crud操作的服务中
应用程序还有一个AuditService
,用于在抛出异常时审核错误。我不想将作用域为HTTP请求的DbContext
注入此服务,因为如果引发异常,我只想将审核条目保存到数据库中,而忽略任何其他挂起的更改。因此,在本例中,插入UnitOfWork
/DbContext
的新实例是有意义的
是否可以配置IoC容器,以便在将UnitOfWork
注入AuditService
时,它应该实例化UnitOfWork的新实例(包装DbContext
的新实例)?但是对于所有其他服务,应该插入作用域为HTTP请求的UnitOfWork
/DbContext
我正在使用ASP.NET Core附带的Microsoft内置IoC容器,但是使用其他IoC容器(例如StructureMap)的示例也会有所帮助。因为您已经编写了使用其他IoC容器的示例,所以我将使用这些示例作为我回答的基础 你想要达到的目标叫做。引用Ninject wiki,您可以: 。。。为一个类型注册多个绑定。注册多个类型绑定有两个主要原因
WhenInjectedInto()
helper指定绑定约束。此类绑定的示例如下所示:
Bind<IUnitOfWork>().To<UnitOfWork>().WhenInjectedInto(typeof(AuditService));
由于您的
AuditService
是这样一个特定的适配器,我可能会让它在内部创建和处理DbContext
本身;所以根本不注入DbContext
。这将使事情变得非常明确,并简化您的配置。Ninject不支持ASP.NET Core 1.0吗?一些较新的IoC框架插入ASP.NET的IServiceCollectionIServiceCollection
,并添加扩展方法来添加特定于此框架的功能(装饰器等)?应该注意的是,这个问题是关于ASP.NET CoreAh的!太好了,谢谢你指出这一点。不知何故,我完全忽略了问题中规范的那一部分:\@Tseng在四处寻找信息之后,Ninject中似乎没有对ASP.NET核心的本机支持,反之亦然。
Bind<IUnitOfWork>().To<UnitOfWork>().WhenInjectedInto(typeof(AuditService)).InSingletonScope();