【发布时间】:2011-06-10 23:42:52
【问题描述】:
我对使用 Autofac 的 DI 相当陌生,想知道以下是否可行
我想创建一个通用控制器和接收 注入型。 我不想要注入类型的实例,但只需要它 类型,这将是预期接口的实现。
我也想将通用类型传递给 ViewModel,但这完全是另一个主题,但是如果那里的一些天才可以解决这两个问题,那就太好了。
public ContractorController<T> : Controller
where T : IContractor{
public ViewResult New() {
var vNewModel = new NewViewModel<T>();
return View(vNewModel);
}
}
这个控制器应该通过
http://mysite.com/Contractor/New
我一直在研究使用 AutoFac 注册泛型,但它
似乎问题在于 AutofacControllerFactory 仅实现 GetControllerInstance(),期望从 GetController() 或 CreateController() 传递给它的控制器类型,不确定它们之间的差异或差异。这些方法从 RoutData 接收控制器的名称作为字符串,并返回相应的 .NET 类型,给出 url,http://mysite.com/Contractor/New 是 controller=Contractor,因此 GetController() 或 CreateController() 无法匹配 ContractorController,因此将 null 传递给GetControllerInstance() 表示 AutofacControllerFactory 不会尝试解析类型。
我认为我必须创建一个自定义控制器工厂 从 AutofacControllerFactory 派生,覆盖 GetController() 或 CreateController() 和 执行我自己的从控制器名称到泛型类型的映射。 像
if (controllerName == "Contractor") 返回 System.Type.GetType( “UI.Controllers。” +控制器名称+“控制器`1”);
当我调试它时,我可以看到这段代码正在寻找通用控制器并返回它。
我想我可以只注册像
这样的类型builder.RegisterType<FakeContractor>().As<IContractor>();
builder.RegisterGeneric(typeof(ContractorController<>));
但我收到以下错误
The Autofac service
'UI.Controllers.ContractorController`1'
representing controller
'ContractorManagement.UI.Controllers.ContractorController`1'
in path '/Contractor/New' has not been registered.
所以我想我可能找错了树。 谁能告诉我如何在不拉动的情况下做到这一点 我的牙齿
谢谢
【问题讨论】:
标签: c# generics model-view-controller controller autofac