Как можно вводить объекты во время выполнения (после инициализации)? - PullRequest
4 голосов
/ 05 апреля 2011

Я использую технику внедрения зависимостей в моих двух текущих текущих проектах.

Я использую Unity в качестве своей платформы IoC.

Я использую класс ComponentBuilder, который отвечает за создание объектов приложения и их подписку на события в рамках инициализации приложения.

После запуска приложения все объекты готовы и данные передаются от одного объекта к другому.

У меня проблема:

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

Поскольку ComponentBuilder уже завершил свою часть, мне нужно найти способ передачи необходимых объектов этим "динамическим" объектам. Эти динамические объекты на самом деле представляют собой иерархию объектов, созданных во время выполнения, для самого глубокого объекта в иерархии необходим компонент (объект) из верхней части иерархии.

Я подумал о двух возможных решениях (они мне не нравятся оба):

  1. Передайте контейнер всех объектов из ComponentBuilder динамическим объектам, чтобы они могли использовать нужные объекты и подписаться на них. Основным недостатком этой опции является раскрытие всех объектов, которые могут скрывать зависимости между объектами. Я видел, что некоторые люди передают контейнер объектов всем объектам, как если бы он был логгером или дисплеем, я думаю, что это неправильно и скрывает зависимости, которые мы хотим представить другим объектам.

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

вы можете придумать лучшее решение?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Кажется, вам нужен стандартный шаблон фабрики / абстрактной фабрики, в котором вы передаете зависимости времени компиляции в конструкторе и зависимости времени выполнения в методах создания.

class Factory
{
  ISomeService service;

  public Factory(ISomeService service)
  {
    this.service = service;
  }


  public SomeObject CreateItem(object runtimeDependency)
  {
    return new SomeObject(service, runtimeDependency);
  }
}
0 голосов
/ 05 апреля 2011

Я не очень понял ваш вопрос.Но, похоже, вы ищете шаблон Service Locator .В большинстве сред IoC есть какой-то статический объект, который позволяет создавать зависимости на лету, а не вставлять их в конструкторы или свойства.

Но для этого требуется, чтобы ваш код знал о вашем IoC.Я ненавижу это требование, так что это не возможное решение.В этом случае лучшим решением будет создание Factory , которое позволит вам создать свои зависимости.В этом случае конкретный способ разрешения этих зависимостей может быть скрыт конкретной фабрикой, то есть внутренне, используя ваш конкретный IoC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...