C# IoC容器-仅为特定服务注入新的DbContext实例

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的

我的C#web应用程序首先使用Entity Framework 7代码。
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的IServiceCollection
    IServiceCollection
    ,并添加扩展方法来添加特定于此框架的功能(装饰器等)?应该注意的是,这个问题是关于ASP.NET CoreAh的!太好了,谢谢你指出这一点。不知何故,我完全忽略了问题中规范的那一部分:\@Tseng在四处寻找信息之后,Ninject中似乎没有对ASP.NET核心的本机支持,反之亦然。
    Bind<IUnitOfWork>().To<UnitOfWork>().WhenInjectedInto(typeof(AuditService)).InSingletonScope();