2014-12-04 4 views
1

Первый раз с использованием 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; 
    } 
} 
+0

добавить без параметров открытый конструктор? –

+0

@ Selman22 - это неправильный ответ. Ошибка возникает из-за того, что единство MS не «впрыскивает» что-либо в конструктор, что и должно делать (и устраняя необходимость в конструкторе без параметров). Тем не менее, у меня есть только опыт в Ninject, а не Unity, поэтому я не могу сказать, что неправильно настроено для OP – Tommy

+0

Покажите свой класс 'AdministrationService'. – haim770

ответ

0

Найдено вопрос.

Я закомментировал строку:

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

Мне нужно вернуться к их пути, чтобы не нарушить существующий код. Однажды я перейду к рефакторингу.

+0

У меня было ощущение, что это решение, потому что так оно и настраивается в моих проектах, но я также использую подход, в котором интерфейсы вводятся через конструктор. Я не совсем уверен, почему это не работает для вас. –

Смежные вопросы