Asp.net mvc 依赖注入构造函数冲突

Asp.net mvc 依赖注入构造函数冲突,asp.net-mvc,model-view-controller,dependency-injection,inversion-of-control,Asp.net Mvc,Model View Controller,Dependency Injection,Inversion Of Control,我有一个控制器,我想使用依赖注入和构造函数,这是我的代码 private readonly IHomeService _iHomeService; public HomeController(IHomeService iHomeService) { _iHomeService = iHomeService; } public HomeController() { } 当我删除没有任何参数的构造函数(第二个构造函数)时

我有一个控制器,我想使用依赖注入和构造函数,这是我的代码

    private readonly IHomeService _iHomeService;

    public HomeController(IHomeService iHomeService)
    {
        _iHomeService = iHomeService;
    }

    public HomeController()
    {

    }
当我删除没有任何参数的构造函数(第二个构造函数)时,我看到以下错误:

No parameterless constructor defined
当我使用不带任何参数的构造函数时,我看到我的私有字段为null(_iHomeService=null),因为程序使用不带参数的构造函数


如何解决依赖项注入的问题?

好吧,要进行依赖项注入,您需要使用框架或控制器工厂

试一试

公共类HomeController:控制器
{
私有只读IWelcomeMessageService welcomeMessageService;
公共家庭控制器(IWelcomeMessageService welcomeMessageService)
{
this.welcomeMessageService=welcomeMessageService;
}
公共空间索引()
{
ViewModel.Message=this.welcomeMessageService.TodaysWelcomeMessage;
返回视图();
}
}
公共类WelcomeMessageServiceModule:NinjectModule
{
公共覆盖无效负载()
{
this.Bind().To();
}
}

框架将控制控制器实例的创建并传递constractor参数。ASP.NET使用
ControllerFactory
按需实例化控制器。此类要求控制器具有无参数构造函数,可用于创建其实例

您需要使用依赖项注入框架来创建控制器并注入所需的依赖项,但我知道这是有缺陷的。我建议使用来管理依赖注入。它与ASP.NET集成得非常好,并且有一个关于集成它的教程

如果您沿着这条路线走下去,最终会得到控制器和服务的安装程序:

public class Installer : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
        container.Register(Component.For<IHomeService>.ImplementedBy<HomeService>());
    }
}
最后,您将创建一个容器并设置一个新的控制器工厂:

var container = new WindsorContainer().Install(new Installer());
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

您还可以使用或。

这听起来像是希望自动实例化
HomeService
类并将其注入控制器

使用像Ninject或StructureMap这样的IoC框架将为您做到这一点——一旦您设置好它


如果您不想使用IoC框架,则需要在构造函数中手动实例化
HomeService

是否使用Castle Windsor之类的IoC容器?不,我不使用任何IoC容器您实际上不需要框架来执行DI,手动注入依赖项是完全可能的。@JoeR-我已经纠正了“您需要(!)使用框架或(!)使用控制器工厂。”
public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
        }
        return (IController) _kernel.Resolve(controllerType);
    }
}
var container = new WindsorContainer().Install(new Installer());
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);