2016-07-05 54 views
4

我有一个需要三个构造函数参数的类。在我的作文根中,我想定义/覆盖仅三个构造函数参数中的一个的;其他两个依赖关系已经映射到我的DI容器中,并且应该从IServiceProvider创建。IServiceCollection覆盖单个构造函数参数

随着Ninject我可以做这样的事情:

Bind<IMyInterface>().To<MyClass>()  
    .WithConstructorArgument("constructorArgumentName", x => "constructor argument value"); 

当Ninject创建MyClass的它使用此字符串参数,并自动注入其他两个依赖我。我在.net core中遇到的问题是,我无法告诉IServiceCollection,我只想指定三个参数中的一个,我必须定义所有这些参数或者没有。例如,在.NET的核心,这是我必须做的:

services.AddTransient<IMyInterface>(x=> new MyClass("constructor argument value", new Dependency2(), new Dependency3()); 

我不喜欢创建Dependency2和Dependency3类的新实例;这两个类可以有自己的构造函数参数。我只想让DI管理这些依赖关系。所以我的问题是 - 如何在使用IServiceCollection类在.net核心中映射依赖关系时重写单个构造函数参数?

如果你不能重写只有一个构造参数,那么你如何解决与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 services)。 “提供者”类在哪里创建? – jwdenny13

+1

'provider'是'Func'参数,它的类型是'IServiceProvider'。在你的问题中,你将它定义为'x'。 –

+0

哦,我明白了。我完全忽略了:)。谢谢你,伟大的作品! – jwdenny13