2013-06-20 2 views
0

У меня есть следующий класс, реализующий 3-й интерфейс партии:Как сделать правильный IoC в этой ситуации?

public class RegistrationService : IRegistrationService 
{ 
    public void Register() 
    { 
     .... 
    } 
} 

Как этот класс отвечают некоторым части инициализации приложения не имеют некоторые зависимости требуемом класса, доступных во время конструкта, так что я не могу передать их в конструктор, как вы, как правило, выполняет IoC.

Я не могу изменить метод Register, поскольку это подразумевает изменение интерфейса, который является сторонним.

Если я создаю зависимости мне нужно от метода регистра как:

{ 
    IRequiredService requiredService; 

    public void Register() 
    { 
     this.requiredService = new RequiredService(); 
    } 
} 

Тогда я не могу дразнить RequiredService в UnitTest класса. Я использую Unity, и у меня есть контейнер, доступный в классе, но я не вижу, как он может мне помочь.

Любая помощь будет действительно оценена.

ответ

3

Вы можете передать конструктору делегат фабрики, который вы можете использовать для создания RequiredService, если требуется.

Что-то вроде:

private readonly Func<IRequiredService> serviceCreator; 

public RegistrationService(Func<IRequiredService> serviceCreator) 
{ 
    this.serviceCreator = serviceCreator; 
    ... 

Тогда в Register():

public void Register() 
{ 
    this.requiredService = serviceCreator(); 
} 
+0

Отличное решение, действительно приятно. Я собираюсь попробовать это, спасибо. –

1

Вы могли бы использовать инъекции собственности вместо этого?

public class RegistrationService : IRegistrationService 
{ 
    [Dependency] 
    public IRequiredService RequiredService { get; set; }; 

    public void Register() 
    {} 
} 

Думаю, я предпочитаю подход Мэтью!

Cheers

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