0

Я пытаюсь ввести два класса в свой конструктор, проблема в том, что они оба одного и того же интерфейса. Моя регистрирующий является:Введение в конструктор конструктора Unity с подразумеваемыми именами

container.RegisterType<ITrackerSection, ScopeSection>(); 
container.RegisterType<ITrackerSection, SampleSection>(); 

Как вы можете видеть, что они оба типа ITrackerSection но имеют разные реализации. Мой конструктор выглядит следующим образом:

public TrackerEngine(ITrackerSection scopeSection, ITrackerSection sampleSection) 

Оба эти параметры вводятся как sampleSection, как это было в прошлом должны быть зарегистрировано для данного типа интерфейса. У меня нет никаких проблем с именами зарегистрированных типов, например

container.RegisterType<ITrackerSection, ScopeSection>("scopeSection"); 
container.RegisterType<ITrackerSection, SampleSection>("sampleSection"); 

Но это сейчас означает, что я должен указать параметры классов и что кажется беспорядочным и добавляя зависимость, когда единство больше, чем способно решить их. Кроме того, регистрацию TrackerEngine также необходимо будет указать параметры. Я знаю, что я мог бы использовать атрибут в строке в конструкторе TrackerEngine, но я бы предпочел Unity вывести объекты по именам.

Может ли Unity (я не могу заставить это работать) правильно внедрить правильную реализацию интерфейса исключительно из имени, заданного параметру в конструкторе? Поэтому ITRAckerSection scopeSection является тем же именем, что и при регистрации ScopeSection, поэтому используйте этот тип.

+0

Почему эти два класса реализуют один и тот же интерфейс? Ваш дизайн кажется неоднозначным. Если вы дадите им каждый свой собственный интерфейс, все ваши проблемы исчезнут. – Steven

+0

Создание интерфейсов, специфичных для каждого типа, кажется анти-шаблоном. Интерфейс определяет структуру, которую должны иметь все эти разделы. IScopeSection: ITrackerSection, по-видимому, является дополнительным кодом для решения проблемы, которая не должна существовать. –

+0

неоднозначность также является анти-шаблоном. – Steven

ответ

0

Я согласен с комментариями относительно совместного использования интерфейса. Весь смысл МОК в том, что вашему движку не нужно знать, какую реализацию использовать. Ему должен быть предоставлен только интерфейс.

способ решить это, чтобы позволить Unity вводить массив интерфейсов:

public TrackerEngine(ITrackerSection[] trackerSections) { } 

Таким образом, вы можете придать обоим. Но тогда, если вам действительно нужно знать, какой интерфейс есть, вы можете реализовать перечисление или что-то в своем интерфейсе. Что-то вроде этого:

public interface ITrackerSection { 
    SectionType Section { get; } 
} 

public enum SectionType{ 
    0 = Scope, 
    1 = Sample 
} 

И в вашей реализации:

public class ScopeTrackerSection : ITrackerSection { 
    // Do your stuff... 

    public SectionType Section { 
     get { return SectionType.Scope; } 
    } 
} 

public class SampleTrackerSection : ITrackerSection { 
    // Do your stuff... 

    public SectionType Section { 
     get { return SectionType.Sample; } 
    } 
} 

И в двигателе, вы можете получить интерфейс, необходимый для желаемого действия.

public TrackerEngine(ITrackerSection[] trackerSections) { 
    var scopeTrackerSection = trackerSections.FirstOfDefault(x => x.Section == SectionType.Sample); 

// Do something with scopeTrackerSection 

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