无参数公共构造函数
本文关键字:构造函数 参数 | 更新日期: 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;
}
我必须回到他们的方式,以免破坏现有代码。总有一天我会着手重构。