2016-04-28 91 views
2

我的C#Web应用程序首先使用实体​​框架7代码。 DbContext的作用域是HTTP请求的生命周期。有一个UnitOfWork类包装这个DbContext。这被注入到大多数需要在数据库上执行Crud操作的服务中。IoC容器 - 仅为特定服务注入新的DbContext实例

该应用程序还有一个AuditService它用于在抛出异常时审计错误。我不想将范围限定为HTTP请求的DbContext注入到此服务中,因为如果抛出异常,我只想将审计条目保存到数据库并忽略任何其他未决更改。因此在这种情况下注入一个新的实例UnitOfWork/DbContext是有意义的。

是否有可能配置IoC容器,以便当UnitOfWork注入AuditService,应该实例化的UnitOfWork的新实例(包起来的DbContext的新实例)?但是对于所有其他服务,应该注入作用域为HTTP请求的UnitOfWork/DbContext而不是?

我使用的是Microsoft内置的IoC容器,它附带了ASP.NET Core,但使用其他IoC容器(例如StructureMap)的示例也会有所帮助。

+0

因为你'AuditService'就是这样一个特定的适配器,我可能会让它创建和处置'DbContext'在内部;所以根本不需要注入'DbContext'。这将使事情变得非常明确并简化您的配置。 – Steven

回答

1

由于您已经写过使用其他IOC容器的例子,所以我将使用Ninject作为我的答案的基础。

你想实现的目标叫做Contextual binding。从Ninject wiki引用,您可以:

...为类型注册多个绑定。主要有两个原因,一个可能要注册多个类型绑定

  1. 多个绑定 - 为上下文结合考虑上下文考虑
  2. 多个绑定 - 为多注射

我想您正在寻找第一种类型或注册,而您使用WhenInjectedInto()帮助程序指定绑定约束。这种结合的一个例子应该是这样的:

Bind<IUnitOfWork>().To<UnitOfWork>().WhenInjectedInto(typeof(AuditService)); 

如果它未提供,则默认object scopeTransient,这意味着:

每次一个将要创建的类型的新实例请求。

只要你喜欢你可以更改为您所需的范围,例如:

Bind<IUnitOfWork>().To<UnitOfWork>().WhenInjectedInto(typeof(AuditService)).InSingletonScope(); 
+0

不支持ASP.NET Core 1.0吗?一些较新的IoC框架插入到ASP中。NET的'IServiceCollection'并添加扩展添加特定于此框架的功能的方法(装饰器等)?应该注意的问题是关于ASP.NET Core – Tseng

+0

的具体问题啊!太好了,谢谢你指出。不知何故,我已经完全忽略了这个问题中的规范部分:\ – kayess

+0

@Tseng在获得信息后,似乎Ninject for ASP.NET核心没有本地支持,反之亦然。 – kayess