[Dependency-Injection] Есть ли шаблон для инициализации объектов, созданных с помощью контейнера DI


Answers

Обычно, когда вы сталкиваетесь с этой ситуацией, вам нужно пересмотреть свой дизайн и определить, смешиваете ли вы объекты состояния / данных с вашими чистыми сервисами. В большинстве (не всех) случаях вы захотите разделить эти два типа объектов.

Если вам нужен параметр, специфичный для контекста, переданный в конструкторе, одним из вариантов является создание фабрики, которая разрешает ваши зависимостей между службами через конструктор и принимает ваш параметр времени выполнения в качестве параметра метода Create () (или Generate () ), Build () или все, что вы называете фабричными методами).

Как правило, создание сеттеров или метод Initialize () являются плохим дизайном, так как вам нужно «запомнить» их, чтобы они не открывали слишком много состояния вашей реализации (то есть, что остановить кого-либо из - инициализировать инициализацию или сеттер?).

Question

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

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

interface IMyIntf {
  void Initialize(string runTimeParam);
  string RunTimeParam { get; }
}

Затем, чтобы использовать его (в Unity), я бы сделал следующее:

var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");

В этом случае параметр runTimeParam определяется во время выполнения на основе пользовательского ввода. Тривиальный случай здесь просто возвращает значение runTimeParam но на самом деле параметр будет чем-то вроде имени файла, а метод initialize сделает что-то с файлом.

Это создает ряд проблем, а именно, что метод Initialize доступен на интерфейсе и может быть вызван несколько раз. Установка флага в реализации и исключение бросания при повторном вызове Initialize кажется неуклюжим.

В тот момент, когда я разрешаю свой интерфейс, я не хочу ничего знать о реализации IMyIntf . Однако я хочу знать, что для этого интерфейса нужны определенные параметры инициализации одного времени. Есть ли способ каким-то образом аннотировать (атрибуты?) Интерфейс с этой информацией и передавать их в фреймворк при создании объекта?

Изменить: описал интерфейс немного больше.




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

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

В пошаговом руководстве также описывается, как комментировать методы, свойства и даже параметры с помощью атрибутов, чтобы отличать их во время выполнения.

Даже если вы не используете Ninject, пошаговое руководство предоставит вам концепции и терминологию функциональных возможностей, которые соответствуют вашей цели, и вы должны иметь возможность сопоставить эти знания с Unity или другими структурами DI (или убедите вас, чтобы дать Ninject попробовать) ,




Links