在使用参数接口时,我遇到了 Autofac ExtensibleActionInvoker 与 MVC ModelBinder 交互的问题。背景如下:
我正在构建一个 MVC 应用程序,我正在使用 Autofac MVC3 的 ExtensibleActionInvoker 将我的服务作为参数注入到我的操作中,例如
public ActionResult Test( IMyService service)
{
//A new instance of service is created by Autofac ExtensibleActionInvoker
return View();
}
这非常有效,并且设计非常简洁(有关此方法的更多信息,请参阅Alex Meyer-Gleaves 帖子)。我想使用这种方法,因为我正在生成代码生成器来创建操作、视图、服务和 DTO,而按操作服务方法使这更容易。
但是,我还想为从 HttpPost 操作接收输入的操作分类中的参数使用接口。这是因为我使用 DI 在每一层之外创建类。如果我将 DefaultModelBinder 更改为使用 DI 创建类(请参阅 Steve Sanderson 关于 MVC3 的书的第 595 页,了解如何执行此操作),这可以正常工作,例如
[HttpPost]
public ActionResult Test(ITestClass dataComingFromView)
{
//model binder creates the class via DI and then binds it to the data from the post
return View();
}
但是在上面的简单示例中,我与启用的 ExtensibleActionInvoker 发生冲突,即
- 在没有启用 ExtensibleActionInvoker 的情况下,上面的方法可以正常工作,即扩展的 DefaultModelBinder 使用 DI 创建 TestClass 类,并且 modelbinder 将来自视图的输入绑定到类中的字段。
- 启用 ExtensibleActionInvoker 后它不起作用,即我得到一个没有绑定的空 TestClass 类。我假设 ExtensibleActionInvoker 优先于模型绑定器,并且只创建一个空的 TestClass 类。
- (为了完整起见,我应该说,如果我只是“开箱即用”地使用 MVC,即没有新的 DefaultModelBinder 并且没有启用 ExtensibleActionInvoker,那么它说你不能使用接口作为 Action 方法参数。)
对于比我有更好 Autofac 知识的人,我的问题是:我可以更改 Autofac ExtensibleActionInvoker 以选择它绑定的内容吗?我所有注入的服务类都以 IService 开头,因此我可以对其进行过滤。我知道您可以在其他地方的 Autofac 中执行此操作,但无法使用 ExtensibleActionInvoker 执行此操作,但也许我错过了。
任何帮助,将不胜感激。
Jon Smith - 选择性分析