【问题标题】:Parameterless public constructor无参数公共构造函数
【发布时间】:2014-12-04 16:35:06
【问题描述】:

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

【问题讨论】:

  • 添加一个无参数的公共构造函数?
  • @Selman22 - 这不是正确的答案。发生错误是因为 MS unity 没有将任何东西“注入”到构造函数中,这是它应该做的(并消除了对无参数构造函数的需要)。但是,我只有 Ninject 而不是 Unity 的经验,所以我无法判断 OP 的配置有什么问题
  • 显示您的AdministrationService 课程。
  • 是否使用同一个容器实例进行解析?
  • Bootstrapper.Initialise() 何时被调用?这应该在Application_Start 中(高于一切)或使用WebActivatorEx PreApplicationStart 连接起来。

标签: c# asp.net-mvc asp.net-mvc-5 unity-container


【解决方案1】:

发现问题。

我把这行注释掉了:

 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;
}

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

【讨论】:

  • 我感觉这就是解决方案,因为这也是我在项目中的配置方式,但我也使用通过构造函数注入接口的方法。我不太清楚为什么这对你不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多