NetCore, как изменить реализацию интерфейса во время выполнения - PullRequest
0 голосов
/ 11 октября 2019

Я работаю с Net Core и внедрением зависимостей и имею следующий случай:

var rootInstance = container.Resolve<Root>();
rootInstance.Run();

container.Use<IGrandChild, FirstGrandChild>();
var root1Instance = parentContainer.Resolve<Root>();
root1Instance.Run();

container.Use<IGrandChild, SecondGrandChild>();
var root2Instance = parentContainer.Resolve<Root>();
root2Instance.Run();

var secondGrandChild = new SecondGrandChild()
{
    Description = "Custom Description"
};

container.User<IGrandChild>(secondGrandChild);
root2Instance = parentContainer.Resolve<Root>();
root2Instance.Run();


Expected response:
# GrandChild
# FirstGrandChild
# SecondGrandChild Default
# SecondGrandChild Custom Description

(Используемые классы: https://gist.github.com/lvitti/4f531479037bd335d1c118208b3dfb6b)

Я хочу знать, возможно ли это сделатьэто с внедрением зависимости или другим методом.

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

  • Autofac
  • Замок Виндзор
  • Ламар
  • Ninject
  • LightInject
  • SimpleInjector

1 Ответ

0 голосов
/ 12 октября 2019

В каждом контейнере есть средство для регистрации нескольких реализаций, поэтому Castle Windsor делает это следующим образом: Зарегистрируйте реализации:

container.Register(
    Component.For<IMyService>()
        .ImplementedBy<MyServiceImpl>()
        .Named("myservice.default"),
    Component.For<IMyService>()
        .ImplementedBy<OtherServiceImpl>()
        .Named("myservice.alternative"),
);

Разрешите реализацию, основанную на решении во время выполнения:

string impName = "myservice.alternative"; // specify it based on your decision rule
IMyService service = container.Resolve<IMyService>(impName);
...