У меня есть класс, который принимает три аргумента конструктора. В моем составе root я хочу определить/переопределить только один из из трех аргументов конструктора; две другие зависимости уже были сопоставлены в моем контейнере DI и должны быть созданы из IServiceProvider.IServiceCollection переопределяет один аргумент конструктора
С Ninject я мог бы сделать что-то вроде этого:
Bind<IMyInterface>().To<MyClass>()
.WithConstructorArgument("constructorArgumentName", x => "constructor argument value");
Когда Ninject создает MyClass использует этот параметр строки и автоматически вводит два других зависимостей для меня. Проблема, с которой я столкнулась в ядре .net, заключается в том, что я не могу сказать, что IServiceCollection я хочу указать только один из трех аргументов, я должен определить их или нет. Например, в .net ядра это то, что я должен сделать:
services.AddTransient<IMyInterface>(x=> new MyClass("constructor argument value", new Dependency2(), new Dependency3());
мне не нравится, чтобы создавать новые экземпляры классов Dependency2 и Dependency3; эти два класса могут иметь свои собственные аргументы конструктора. Я просто хочу, чтобы DI управлял этими зависимостями. Поэтому мой вопрос: как вы переопределяете один аргумент конструктора при сопоставлении зависимостей в ядре .net с использованием класса IServiceCollection?
Если вы не можете переопределить только один аргумент contructor, то как вы решаете зависимость с IServiceCollection? Я пытался сделать что-то вроде этого:
services.AddTransient<IMyInterface>(x=> new MyClass("constructor argument value", serviceCollection.Resolve<IDependency2>(), serviceCollection.Resolve(IDependency3>());
Но это не сработало, и я не мог понять, как разрешить зависимости с помощью IServiceCollection.
У вас есть класс «провайдера» там, но я не вижу, что это такое и где его приходит? Мой выше код находится в классе Startup.cs в методе с этой сигнатурой: public void ConfigureServices (службы IServiceCollection). Где создается класс «поставщик»? – jwdenny13
'provider' является параметром' Func', а его тип - 'IServiceProvider'. В вашем вопросе вы определили его как «x». –
О, я вижу. Я полностью забыл об этом :). Спасибо, отлично работает! – jwdenny13