Внедрение конкретной реализации в стандартном контейнере



Допустим, у нас есть некоторый интерфейс, который имеет несколько реализаций:





public interface IDependency {}



public class DependencyImplOne : IDependency {}

public class DependencyImplTwo : IDependency {}





И мы хотим, используя стандартный DI контейнер .NET Core, внедрить в определённый сервис конкретную реализацию этого контракта.

То есть:





public class BarService : IBarService

{

public BarService(IDependency dependency) // DependencyImplOne

{

}

}



public class BazService : IBazService

{

public BazService(IDependency dependency) // DependencyImplTwo

{

}

}





К сожалению, стандартный контейнер не предоставляет встроенных возможностей для решения этой задачи.

Он спроектирован просто и минималистично, чтобы новый функционал было легко добавлять согласно индивидуальным потребностям.



Здесь есть несколько вариантов решения:



1⃣ Создание фабрики



2⃣ Создание Service Delegate



3⃣ Внедрение коллекции зависимостей IEnumerable<IDependency> с её последующим перебором



4⃣ Явная регистрация, например: services.AddTransient<IBazService, BazService>(_ => new BazService(new DependencyImplTwo()))



Конечно, указанные решения не идеальные.

В такой ситуации стоит посмотреть в сторону других контейнеров.

Ставьте реакции на этот пост, если хотите, чтобы я о них написал.