繁体   English   中英

无参数公共构造函数

[英]Parameterless public constructor

首次使用MS Unity。 我有一个具有以下构造函数的控制器:

 protected IAdministrationService AdministrationService { get; set; }

 public GenerateCacheController(IAdministrationService administrationService)
 {
    AdministrationService = administrationService;
 }

尝试运行项目时出现以下错误:

确保控制器具有无参数的公共构造函数。

在我的Bootstrpper.cs文件中,RegisterTypes方法具有以下内容:

container.RegisterType<GenerateCacheController>();

我仍然收到错误。 我还有什么想念的吗? 我正在使用ASP.NET MVC 5和Unity 3。

这是我的Boostrapper.cs文件:

 public static class Bootstrapper
{
    public static IUnityContainer Initialise()
    {
        var container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterInstance(container);
        var im = new InjectionMember[0];
        container.RegisterType<IAdministrationService, AdministrationService>("AdministrationService", im);
        container.RegisterType<ILookupMapper, LookupMapper>("LookupMapper", im);
        container.RegisterType<IEmailService, EmailService>("EmailService", im);

        container.RegisterType<GenerateCacheController>();

        var provider = new UnityServiceLocator(container);
        ServiceLocator.SetLocatorProvider(() => provider);
    }
}

AdministrationService类的缩写版本:

 public class AdministrationService : IAdministrationService
{
    protected ILookupMapper LookupMapper { get; set; }
    protected IEmailService EmailService { get; set; }

    public AdministrationService(ILookupMapper lookupMapper, IEmailService emailService)
    {
        LookupMapper = lookupMapper;
        EmailService = emailService;
    }
}

找到了问题。

我注释了这一行:

 var im = new InjectionMember[0];
 container.RegisterType<IAdministrationService, AdministrationService>("AdministrationService", im);

并添加:

container.RegisterType<IAdministrationService, AdministrationService>();

之所以可行,是因为以前的开发人员正在做这样的事情:

private IUnityContainer Container { get; set; }

public AdministrationService()
{
    Container = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IUnityContainer>();
}

代替

protected ILookupMapper LookupMapper { get; set; }
protected IEmailService EmailService { get; set; }

public AdministrationService(ILookupMapper lookupMapper, IEmailService emailService)
{
    LookupMapper = lookupMapper;
    EmailService = emailService;
}

我必须回到不破坏现有代码的方式。 我会去重构的一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM