2015-12-11 140 views
0

今天我開始使用Ninject了,因爲Structuremap讓我大開眼界。Ninject多種類型構造函數

當我開始使用相同的接口註冊相同的類型但我已經命名它們(如下所示)時,我遇到了一個問題。

kernel.Bind<IDataContextAsync>().To<DbGeoContext>().InRequestScope().Named("DbGeoContext"); 
kernel.Bind<IDataContextAsync>().To<DbEspContext>().InRequestScope().Named("DbEspContext"); 

IParameter geoUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbGeoContext")); 
IParameter espUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbEspContext")); 

kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkGeoContext").WithConstructorArgument(geoUnitOfWorkDbContext); 
kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkEspContext").WithConstructorArgument(espUnitOfWorkDbContext); 

**Fails here with: Error activating IDataContextAsync 

多於一個的匹配綁定可用**

變種T1 = kernel.Get( 「UnitOfWorkGeoContext」); var t2 = kernel.Get(「UnitOfWorkEspContext」);

有人可以幫我弄清楚這裏發生了什麼,以及如何解決它?

我明白在運行時Ninject不會能夠找出哪個實例注入,但我雖然這是'命名'實例是什麼?

感謝

+0

[接口與ninject多個實現](的可能的複製http://stackoverflow.com/questions/19119591/ interface-with-multiple-imple-in-ninject) –

+0

構造函數必須具有'Named'屬性 –

+0

嗨這不是重複的,因爲我試圖實現l RegisterService方法中的綁定邏輯。我不想將ninject庫包含到我的Repository層中。 – Csharper

回答

0

當使用Ninject爲目標的同一個接口的多個實現,你需要與.Named呼籲這樣做,你做的事。但是您還需要在構造函數中添加Named屬性,以便Ninject知道要解析哪個實現。

如這裏所示:

https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-constrained-resolution-named-bindings

class SomeClassThatConsumesOneOfYourImplementations 
{ 
    public SomeClassThatConsumesOneOfYourImplementations(
     [Named("DbGeoContext")] IDataContextAsync context) 
    { 
     // Constructor logic... 
    } 
}