2016-07-05 3 views
4

У меня есть класс, который принимает три аргумента конструктора. В моем составе 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.

ответ

6

Попробуйте это:

services.AddTransient<IDependency2, Dependency2Impl>(); 

services.AddTransient<IDependency3, Dependency3Impl>(); 

services.AddTransient<IMyInterface>(provider=> 
    return new MyClass("constructor argument value", 
     provider.GetService<IDependency2>(), 
     provider.GetService<IDependency3>()); 
); 
+0

У вас есть класс «провайдера» там, но я не вижу, что это такое и где его приходит? Мой выше код находится в классе Startup.cs в методе с этой сигнатурой: public void ConfigureServices (службы IServiceCollection). Где создается класс «поставщик»? – jwdenny13

+1

'provider' является параметром' Func', а его тип - 'IServiceProvider'. В вашем вопросе вы определили его как «x». –

+0

О, я вижу. Я полностью забыл об этом :). Спасибо, отлично работает! – jwdenny13

Смежные вопросы