使用Unity动态注入构造函数参数

时间:2012-10-09 09:51:48

标签: asp.net-mvc dependency-injection unity-container constructor-injection

我在ASP.NET MVC 4应用程序中使用Unity容器进行依赖项注入。

对于特定的控制器(比如ProductController),我有一个依赖注入场景如下:

  1. ProductController构造函数采用IProductsRepository实例。
  2. IProductsRepository实现有一个接受IProductsService实例的构造函数。
  3. IProductsService实现有一个构造函数,它接受一个身份验证令牌字符串,该字符串是从Web请求中的cookie中检索的。
  4. 在这种情况下进行自动依赖注入的正确方法是什么,考虑到只能在创建控制器实例后检索身份验证令牌cookie?

2 个答案:

答案 0 :(得分:1)

如果您需要延迟创建ProductService,您可以

  • 为该服务注入自定义工厂
  • 让DI容器自动生成类型Func<IProductService>的委托工厂,并将该委托注入您的控制器
  • 让容器生成一个lazy proxy,隐藏服务的延迟创建

我更喜欢第三种选择,因为它对IProductService

的消费者完全透明

答案 1 :(得分:0)

我认为你有两个选择:

1使用container.Resolve()并在参数可用时传递参数。

所以,不要在IProductsService的构造函数中询问ProductsRepository,而是执行以下操作:

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

这称为ParameterOverride。可以在此处找到MSDN文档:Resolving Objects by Using Overrides

2不是传递普通的身份验证令牌字符串,而是将其封装在接口后面并传递它。您的IProductsService会占用IAuthenticationTokenProvider,并会要求该课程提供所需的令牌。您的实现将在创建后访问所需的对象以获取正确的值。

我会选择第二种选择。它将使您的设计更加清晰,让Unity无需任何手动工作即可处理所有依赖注入。