Внедрение конкретной реализации в стандартном контейнере
Допустим, у нас есть некоторый интерфейс, который имеет несколько реализаций:
И мы хотим, используя стандартный DI контейнер .NET Core, внедрить в определённый сервис конкретную реализацию этого контракта.
То есть:
К сожалению, стандартный контейнер не предоставляет встроенных возможностей для решения этой задачи.
Он спроектирован просто и минималистично, чтобы новый функционал было легко добавлять согласно индивидуальным потребностям.
Здесь есть несколько вариантов решения:
1⃣ Создание фабрики
2⃣ Создание Service Delegate
3⃣ Внедрение коллекции зависимостей
4⃣ Явная регистрация, например:
Конечно, указанные решения не идеальные.
В такой ситуации стоит посмотреть в сторону других контейнеров.
Ставьте реакции на этот пост, если хотите, чтобы я о них написал.
Допустим, у нас есть некоторый интерфейс, который имеет несколько реализаций:
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()))
Конечно, указанные решения не идеальные.
В такой ситуации стоит посмотреть в сторону других контейнеров.
Ставьте реакции на этот пост, если хотите, чтобы я о них написал.