C# 带AutoFac的MVC控制器通用注入

C# 带AutoFac的MVC控制器通用注入,c#,generics,model-view-controller,controller,autofac,C#,Generics,Model View Controller,Controller,Autofac,我对使用Autofac的DI还比较陌生,不知道是否可以做到以下几点 我想创建一个接收 注射型。 我不想要注入类型的实例,只需要它的 类型,它将是预期接口的实现 我还想将该泛型类型传递给ViewModel,但这完全是另一个主题,不过,如果有人能解决这两个问题,那就太好了 public ContractorController<T> : Controller where T : IContractor{ public ViewResult New() {

我对使用Autofac的DI还比较陌生,不知道是否可以做到以下几点

我想创建一个接收 注射型。 我不想要注入类型的实例,只需要它的 类型,它将是预期接口的实现

我还想将该泛型类型传递给ViewModel,但这完全是另一个主题,不过,如果有人能解决这两个问题,那就太好了

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

    public ViewResult New() { 
            var vNewModel = new NewViewModel<T>(); 
            return View(vNewModel); 
        } 
} 
但是我得到了以下错误

The Autofac service 
'UI.Controllers.ContractorController`1' 
representing controller 
'ContractorManagement.UI.Controllers.ContractorController`1' 
in path '/Contractor/New' has not been registered. 
所以我想我可能找错人了。 谁能告诉我怎么不用拉就可以做到这一点 我的牙齿


谢谢你

我不太清楚你为什么想要一个使用通用控制器的控制器。Mvc并不真正支持在控制器上使用泛型,或者至少会涉及到支持的路由路径。也许你可以提供更多关于该方法背后原因的信息

看起来,您需要一个支持针对不同类型的模型绑定的控制器。下一个问题是,这些类型在公共接口或基类中是否有所不同

如果是这种情况,请查看Mvc2。这将很好地与Autofac配合使用。这将允许在post或get上对类型进行模型绑定,从而允许您使用autofac注入服务


如果您想通过一个共同的基础来改变类型-支持各种具体的视图模型-那么请查看。有一个版本可以在MVC1和Mvc3中使用,现在MvcContrib for Mvc3有一个很好的示例应用程序。Mvc3的实现也更快-速度以前不是问题,它只是一个更有效的识别过程。

也许这不是对您问题的直接回答,但这是我见过并使用过的唯一可能使用通用控制器的方法:

public abstract class ContractorControllerBase<T> : Controller where T : IContractor { 
    public ViewResult New() { 
        var vNewModel = new NewViewModel<T>(); 
        return View(vNewModel); 
    } 
} 

public class FakeContractorController : ContractorControllerBase<FakeContractor> {
}
公共抽象类ContractorControllerBase:Controller其中T:IContractor{
public ViewResult New(){
var vNewModel=NewViewModel();
返回视图(vNewModel);
} 
} 
公共类FakeContractorController:ContractorController数据库{
}
public abstract class ContractorControllerBase<T> : Controller where T : IContractor { 
    public ViewResult New() { 
        var vNewModel = new NewViewModel<T>(); 
        return View(vNewModel); 
    } 
} 

public class FakeContractorController : ContractorControllerBase<FakeContractor> {
}