Вы можете использовать контейнер IoC. (См. сравнение здесь ). Контейнеры IoC могут автоматически разрешать необходимые службы. Предположим, что у нас есть интерфейсы IA
, IB
, IC
и классы A
, B
, C
, реализующие их:
public class A : IA
{
...
}
public class B : IB
{
private readonly IA _a;
public B(IA a)
{
_a = a;
}
...
}
public class C : IC
{
private readonly IB _b;
public C(IB b)
{
_b = b;
}
...
}
Затем вы инициализируете контейнер с помощью (детали отличаются в разных реализациях, но это дает вам представление):
public static ISomeContainer Container { get; } = container = new SomeContainer();
...
container.Register<IA, A>();
container.Register<IB, B>();
container.Register<IC, C>();
Вы также можете указать, что вы хотите, чтобы сервисы создавались как одиночные. Э.Г.
container.Register<IB, B>().AsSingleton();
Теперь вы можете получить услугу с
var myC = container.Resolve<IC>();
Теперь контейнер автоматически создает объект A
, затем создает объект B
, используя первый объект в качестве аргумента конструктора. Наконец, он создает и возвращает объект C
, используя объект B
в качестве аргумента конструктора.
Это означает, что у вас могут быть разные классы, реализующие один и тот же интерфейс, но имеющие разные типы и числа параметров конструктора, и IoC автоматически разрешает все эти параметры.
Вы также можете зарегистрировать разные классы для одного и того же интерфейса, используя ключ, который вы можете указать при разрешении службы.