使用Unity 2.0进行条件方法参数注入

时间:2012-05-12 07:43:10

标签: c# asp.net-mvc-3 dependency-injection unity-container

我的MVC 3控制器类中有一个方法,它接受两个参数:

public ActionResult MyMethod(string providerName, IAuthProvider providerImpl)

我在Unity容器中有多个IAuthProvider注册名称,如下所示:

container.RegisterType<IAuthProvider, FacebookAuthProvider>("facebook");
container.RegisterType<IAuthProvider, GoogleAuthProvider>("google");

因此,当调用该方法时,我希望根据第一个参数解析第二个参数。例如,如果第一个参数是'facebook',则必须将第二个参数从容器解析为名为'facebook'的IAuthProvider实现。

我期待任何想法!

备注:我使用Unity.2.1.505.0

2 个答案:

答案 0 :(得分:3)

你的例子有很多问题。

  1. 操作方法不是依赖注入参数,而是要注入ModelBinder中的值,这些值将浏览器发送的名称 - 值对转换为您的操作可以接受的对象。
  2. 没有DI框架可以开箱即用“绑定第二个参数,基于第一个参数”,因为它超出了它们的范围。如果DI可以根据运行时值确定要为IAuthProvider注入的内容,那只能是因为你已经为它编写了一些自定义代码。
  3. 您需要的不是Unity,您需要根据自己的要求编写自定义ModelBinder - 查看herehere示例。扩展默认的ModelBinder,设置一个条件,如果操作是MyMethod,那么查看请求值并自己创建AuthProvider对象并返回该对象。
  4. 在编写自定义模型绑定器时,可以从DI容器中获取提供程序。还要重新考虑参数,如果您的操作正在获取正确的提供程序,那么为什么需要providerName?如果它真的需要它可以不从IAuthProvider本身获得名称?通过检查类型或使用.Name方法? providerName将仅用于自定义模型绑定器

答案 1 :(得分:0)

我认为如果您使用User Autofac,您可以按照预期的方式调用操作。但我不认为你可以用Unity做到这一点。 我用Autofac完成了它。