使用接口参数时,Autofac ExtensibleActionInvoker与MVC ModelBinder交互时出现问题。背景如下:MVC Autofac ExtensibleActionInvoker使用接口参数阻止我使用接口参数
我正在构建一个MVC应用程序,我正在使用Autofac MVC3的ExtensibleActionInvoker将我的服务作为参数注入到我的操作中,例如,
public ActionResult Test(IMyService service)
{
//A new instance of service is created by Autofac ExtensibleActionInvoker
return View();
}
这个作品真的很好,使一个真正干净的设计(见Alex Meyer-Gleaves post有关此方法的更多信息)。我想要使用这种方法,因为我正在生成一个代码生成器来创建操作,视图,服务和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 class和modelbinder将从视图输入的 绑定到类中的字段。
- 使用ExtensibleActionInvoker启用它不起作用,即,我得到一个空的TestClass类,没有绑定。我假设ExtensibleActionInvoker优先于模型联编程序,并创建一个空的TestClass类。
- (只是为了保持完整性,我应该说,如果我只是用MVC“开箱即用”,即没有新的DefaultModelBinder并没有ExtensibleActionInvoker启用,那么它说,你不能使用一个接口作为一个操作方法参数。)
我的问题比我有更好的Autofac知识的人是:我可以更改Autofac ExtensibleActionInvoker以选择它绑定到什么?我所有注入的服务都是从IService开始的,所以我可以对此进行过滤。我知道你可以在Autofac的其他地方做到这一点,但看不到任何与ExtensibleActionInvoker相关的事情,但也许我错过了它。
任何帮助,将不胜感激。
乔恩·史密斯 - 选择性分析
谢谢@smartcaveman。这是一个非常明确的解释,为什么它正在发生,并链接到一些解决方案 - 完美。看过Autofac如何实现这一点,我想我会编写我自己的GetValueProvider,但是通过筛选我替换的参数。我会尝试并报告。 –