无参数公共构造函数

本文关键字:构造函数 参数 | 更新日期: 2023-09-27 18:33:04

第一次使用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;
}

我必须回到他们的方式,以免破坏现有代码。总有一天我会着手重构。