2013-09-04 1 views
0

Привет, мне нужно зарегистрировать два типа для одного и того же интерфейса в Unity.Единство, получающее разные типы для разных классов с тем же интерфейсом

Вот пример того, что я пытаюсь сделать:

container.RegisterType(typeof(IPerson) , typeof(Administrator)) 
container.RegisterType(typeof(IPerson) , typeof(Director)) 

public class School{ 
    private IPerson _director; 
    public School(IPerson director){ 
     _director = director; 
    } 
} 


public class Building{ 
    private IPerson _administrator; 
    public Building(IPerson administrator){ 
     _administrator= administrator; 
    } 
} 

Как бы идти о рассказывать Unity, что для класса школы я хочу экземпляр директора и класса Building Я хочу, чтобы экземпляр администратора?

ответ

3

imho контейнер не завод. Он обычно используется для разрешения служб. И если класс зависит от конкретной реализации, это не зависит от интерфейса. поэтому ваша архитектура имеет недостатки и ее необходимо исправить.

Наиболее распространенный подход является использование завода в классе вместо:

public class School{ 
    private IPerson _director; 
    public School(IPersonFactory factory){ 
     _director = factory.CreateDirector(); 
    } 
} 

public class Building{ 
    private IPerson _administrator; 
    public Building(IPersonFactory factory){ 
     _administrator = factory.CreateAdministrator(); 
    } 
} 

Но это имхо бесполезно, как директора и администраторы различны для разных школ/зданий. В качестве таковых я бы использовал:

public class School{ 
    private IPerson _director; 
    public School(IStaffRepository staffing){ 
     _director = staffing.GetDirector(_schoolName); 
    } 
} 

Не используйте контейнеры IoC для своих бизнес-объектов. Используйте их для разрешения классов (служб), которые используются для поддержки/работы с вашими сущностями.

+0

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

+0

Это хрупкое решение, но может быть выполнено с именованными зависимостями. Однако я бы избегал этого. – jgauffin

+0

Не могли бы вы показать мне пример на это? – aleczandru

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