4

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

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

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

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

4

2 回答 2

2

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

  • 为该服务注入自定义工厂
  • 让 DI 容器自动生成 Type 的委托工厂Func<IProductService>并将该委托注入您的控制器
  • 让容器生成一个惰性代理,向消费者隐藏你的服务的延迟创建

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

于 2012-10-09T10:02:49.360 回答
1

我认为你有两个选择:

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 无需任何手动工作即可处理所有依赖项注入。

于 2012-10-09T10:01:42.537 回答