DI и композитные компоненты - дизайн - PullRequest
2 голосов
/ 04 декабря 2008

Я разрабатываю новый компонент для системы, стараюсь следовать различным рекомендациям по DI, чтобы мы получали отдачу с точки зрения изоляции, насмешек и т. Д.

Итак, у меня есть следующие компоненты (проиллюстрировано как абстракция):

  • Fetcher - поддерживает IFetcher, который извлекает данные из определенных данных источник. Возвращает IDataSource.
  • Builder - поддерживает IBuilder, который строит структуру из IDataSource.

Я хотел бы обернуть их в компонент «Исполнитель» (если не хватает имени), который будет делать следующее:

IDataSet Performer.Perform(IFetcher fetcher, IBuilder builder)
{
  IDataSource ds = fetcher.Fetch();
  return builder.BuildDataSet(ds);
}

Чтобы выполнить рекомендации по внедрению зависимостей и LoD (насколько я понимаю, в любом случае), я передаю компоненты IFetcher и IBuilder.

Мой вопрос - это звучит как приемлемый дизайн? Беседы с коллегами по работе идут по принципу «да, звучит хорошо», но не на 100% убеждены в инкапсуляции класса Performer.

На мой взгляд, Performer представляет собой составной элемент управления, который склеивает несколько разрозненных компонентов, что должно быть приемлемо. Единственный вопросительный знак - должен ли я иметь «Фабрику исполнителей», но это кажется излишним, учитывая, что фактические компоненты (IFetcher и IBuilder) могут быть смоделированы.

Любые мысли будут оценены, спасибо.

1 Ответ

1 голос
/ 04 декабря 2008

С точки зрения DI, единственное, что я хотел бы изменить, - это получить сборщик данных и конструктор в конструкторе исполнителя. т.е.

public class Performer { 

    private IFetcher fetcher; 
    private IBuilder builder;        

    public Performer(IFetcher fetcher, IBuilder builder) {
       this.fetcher = fetcher;
       this.builder = builder;
    }

    public IDataSet Perform(DataSource ds){
       IDataSource ds = fetcher.Fetch();
       return builder.BuildDataSet(ds); 
    }
}

И используйте DI-фреймворк. Нет, я не думаю, что вам нужен фабричный метод. Просто звоните IPerformer всякий раз, когда он вам нужен, и DI-фреймворк создаст его для вас.

...