【问题标题】:Conditional method parameter injection using Unity 2.0使用 Unity 2.0 的条件方法参数注入
【发布时间】:2012-05-12 07:43:10
【问题描述】:

我的 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

【问题讨论】:

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


    【解决方案1】:

    你的例子有很多问题。

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

    【讨论】:

    • 谢谢Zasz!自定义模型绑定器是我真正需要的。
    【解决方案2】:

    我认为,如果您使用 Autofac,您可以按照您的意图通过操作调用注入。但我不认为你可以用 Unity 做到这一点。 我已经用 Autofac 完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多