Каков предпочтительный способ разрешения компонента во время выполнения? - PullRequest
0 голосов
/ 16 марта 2020

Можно запросить некоторые компоненты после разрешения компонента root. Я понимаю, что мы можем использовать container.Resolve<ComponentInterface>(), чтобы получить компонент для этого интерфейса. Тем не менее, нигде не рекомендуется ссылаться на контейнер и вводить контейнер в компонент. Так, где мы можем взять этот контейнер?

Я нашел кое-что из документа Виндзора, что рекомендуется использовать типизированное фабричное средство. Однако, похоже, нам все еще нужен контейнер или ядро:

var factory = kernel.Resolve<IDummyComponentFactory>();
var component = factory.GetSecondComponent();

Откуда должно появиться ядро? Я даже не увидел никакой пользы от использования фабрики, поскольку она выглядит еще более сложной.

Заранее спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

Обычно службы могут быть внедрены в конструкторы и свойства.

public class Component(IService service)
{
}

Если что-то нужно выяснить во время выполнения, тогда полезные фабрики становятся полезными:

interface IService { }
interface IService<T> : IService { }

interface IServiceFactory
{
    // This creates instance of IService<T>, where T is known at runtime
    IService Create(Type type); 
}

Реализация Типичные фабрики обычно должны использовать / вводить контейнер DI. Однако это деталь реализации, отделенная от класса Component. См. Принцип инверсии зависимости: https://deviq.com/dependency-inversion-principle/

Основная идея c состоит в том, что ваши собственные типы должны, в идеале, определять контракт для зависимых сервисов и использовать его только для создания экземпляра IService<T>. Позже, если выполнение контракта нужно будет заменить другим, например, вы решили использовать new или структура DI изменилась, ваши типы будут работать без необходимости изменения.

...