2

我在ASP.NET MVC 4应用程序中使用Unity容器进行依赖注入。使用Unity动态注入构造函数参数

对于特定的控制器(说ProductController的),我有一个依赖注入方案如下:

  1. 的ProductController的构造函数采用IProductsRepository实例。
  2. IProductsRepository实现有一个接受IProductsService实例的构造函数。
  3. IProductsService实现具有一个构造函数,该构造函数接受从Web请求中的cookie中检索的身份验证令牌字符串。

考虑到验证令牌cookie只能在控制器实例创建后才能检索到,在这种情况下执行自动依赖注入的正确方法是什么?

回答

1

如果您需要延迟ProductService的创作,你可以

  • 注入一个定制的工厂,了解服务
  • 让DI容器自动生成Func<IProductService>类型的委托工厂,并注入该委托进入控制器
  • 让容器生成lazy proxy隐藏从消费者服务的延迟创建

我更喜欢第三种选择,因为它对于消费者来说是完全透明的IProductService

0

我认为你有两个选择:

1使用container.Resolve()和传递参数时,它的可用。

因此,而不是在构造函数中要求的IProductsServiceProductsRepository你做这样的事情:

IProductsService anInstance = container.Resolve<IProductsService>(new ParameterOverride("authenticationTokenString", "myValue")); 

这就是所谓的ParameterOverride。 MSDN文档可以在这里找到:Resolving Objects by Using Overrides

2而不是传递简单的身份验证令牌字符串,将其封装在一个接口后面并通过该接口。您的IProductsService将采取IAuthenticationTokenProvider,并会要求该班级获取所需的标记。您的实现将在创建后访问所需的对象以获取正确的值。

我会选择选项二。它可以让你的设计保持清洁,让Unity处理所有依赖注入,而无需任何手动工作。

相关问题