2016-07-05 88 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