gpt4 book ai didi

c# - 使用 AutoFac 的 MVC Controller 通用注入(inject)

转载 作者:行者123 更新时间:2023-11-30 18:43:18 24 4
gpt4 key购买 nike

我对 Autofac 的 DI 还很陌生,想知道以下是否可行

我想创建一个通用的 Controller 和 Action 来接收注入(inject)型。我不想要注入(inject)类型的实例,但只需要它类型,这将是预期接口(interface)的实现。

我还想将该泛型类型传递给 ViewModel,但这完全是另一个主题,但是,如果有一些天才可以解决这两个问题,那就太好了。

public ContractorController<T> : Controller 
where T : IContractor{

public ViewResult New() {
var vNewModel = new NewViewModel<T>();
return View(vNewModel);
}
}

这个 Controller 应该通过调用http://mysite.com/Contractor/New

我一直在考虑使用 AutoFac 注册泛型,但它似乎问题在于 AutofacControllerFactory 仅实现 GetControllerInstance(),期望从 GetController() 或 CreateController() 传递给它的 Controller 类型,不确定它们之间的区别是什么。这些方法从 RoutData 接收 Controller 名称作为字符串,并返回相应的 .NET 类型,给出 url,http://mysite.com/Contractor/New 是 controller=Contractor,因此 ContractorController 不能与 GetController() 或 CreateController() 匹配,然后将 null 传递给 GetControllerInstance(),这意味着 AutofacControllerFactory 不会尝试解析类型。

我认为我必须创建一个自定义 Controller 工厂从 AutofacControllerFactory 派生,覆盖 GetController() 或 CreateController() 和执行我自己的从 Controller 名称到泛型类型的映射。有点像

if (controllerName == "承包商") 返回 System.Type.GetType( “用户界面。 Controller 。” + controllerName + "Controller`1");

当我调试它时,我可以看到这段代码正在寻找通用 Controller 并返回它。

我想我可以只注册像

这样的类型
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.

所以我想我可能找错了树。任何人都可以阐明我如何在不拉动的情况下做到这一点我的 dentry

谢谢

最佳答案

我不完全确定您为什么想要一个使用泛型的 Controller 。 Mvc 并不真正支持在 Controller 上使用泛型——或者至少会涉及支持的路由路径。或许您可以提供有关该方法背后原因的更多信息?

看起来您想要一个支持针对不同类型的模型绑定(bind)的 Controller 。下一个问题是这些类型是否因通用接口(interface)或基类而异。

如果是这样,对于 Mvc2,请查看 the IocModelBinder information .这将与 Autofac 一起很好地工作。这将允许该类型在发布时绑定(bind)模型或允许您使用 autofac 注入(inject)服务。

如果你想通过一个共同的基础来改变类型——支持各种具体的 View 模型——然后查看the DerivedTypeModelBinder in MvcContrib .有一个适用于 Mvc 1、2 的版本,现在 Mvc3 的 MvcContrib 有一个很好的示例应用程序。 Mvc3 实现也更快 - 速度以前不是问题,它只是一个更有效的识别过程。

关于c# - 使用 AutoFac 的 MVC Controller 通用注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com