Обычно службы могут быть внедрены в конструкторы и свойства.
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 изменилась, ваши типы будут работать без необходимости изменения.