2012-05-03 98 views
1

我正在努力學習Ninject,並開始使用我認爲非常簡單的事情。無法使其工作。顯然,我缺少一些基本的東西。連接字符串注入

因此,我有這個小控制檯應用程序,它監聽某個端口上的WCF調用,並將通過WCF傳來的數據保存到數據庫中。在解決方案中有3個項目:1.數據訪問庫,2. WCF的東西和3.控制檯充當主機。 Ninject尚未使用。所以項目之間的依賴關係是這樣的:3 - > 2 - > 1

我想開始注入控制檯主機從其配置到數據訪問庫的連接字符串。谷歌搜索連接字符串註銷帶來了一些例子,但他們不完整。

其中一個例子建議在主機的main()這樣的綁定:

static void Main(string[] args) 
{ 
    new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString }); 
} 

其中ConnectionStrinProvider是隻包含一個屬性ConnectionString的一個簡單的類。我無法弄清楚的是如何在數據訪問庫中實例化ConnectionStrinProvider。我試圖

var csprovider = new StandardKernel().Get<ConnectionStringProvider>(); 

這是行不通的 - 這意味着它返回的供應商,而不是這是結合過程中創建的一個新的實例。我也嘗試將.InSingletonScope()添加到綁定中,結果相同。

回答

1

內核就是跟蹤所有綁定的內容。但是,您每次都要創建一個新實例。這是行不通的。相反,創建內核,然後存儲其關閉(我在這裏過將其存儲在一個局部變量,但你可能會希望將其存儲在一個領域中的一些類):

var connectionStringProvider = new ConnectionStringProvider { ConnectionString = Config.ConnectionString }; 
var kernel = new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(connectionStringProvider); 

現在獲得實例通過訪問現有的內核。

var csprovider = kernel.Get<ConnectionStringProvider>(); 

話雖這麼說,以這種方式使用它是錯誤的方式去了解它,因爲這種模式被稱爲服務定位器模式,這是依賴注入的對立面。一般而言,您可以通過Kernel.Get或通過Kernel.Inject注入頂級類(例如,您的應用程序類具有Main方法),並且通過構造函數或[Inject]'屬性正常注入所有其他依賴項。

此外,大多數情況下還有usually plugins available,因此您不必親自實例化內核。但是,我不知道一個用於控制檯應用程序。

+0

你能否提供一個如何實現我的目標,而不會出錯的代碼示例?我迄今爲止看到的例子在Main中綁定了一些東西,並通過調用kernel.Get()來解析其他模塊中的依賴關係,而不用解釋內核變量來自哪裏。在控制檯應用程序中將它公開爲某個類的靜態成員將會創建從數據訪問庫到控制檯應用程序(1 - > 3)的依賴關係,在我看來,這將首先破壞使用Ninject的目的(這是減少耦合)。 – user1373607

+0

我很高興提供一個更完整的示例,但是您能否詳細說明如何與數據訪問庫進行交互?你可以向我展示你在DAL中實例化/調用東西的代碼(通過編輯你的問題)嗎?另外,你可以提供更多的上下文(比如周圍的類)來獲得'ConnectionStringProvider'嗎? –

2

您需要保留對您設置的內核的引用。如果每次實例化它都不起作用。

public static IKernel Ninject {get; private set;} 
static void Main(string[] args) 
{ 
    Ninject = new StandardKernel() 
    Ninject.Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString }); 
} 

在consummer的一面,你可以調用你的主要的Ninject靜態屬性。

明顯的注意事項:這是示例代碼,在生產代碼中,您可能希望爲該全局靜態變量進行更好的設計。

+0

這將創建從數據訪問庫到控制檯應用程序(1 - > 3)的反向依賴關係,在我看來,這將首先破壞使用Ninject的目的(這是爲了減少耦合)。 – user1373607

+0

是的。這是所有關於顯而易見的注意事項。 'StandarKernel' ctor爲配置模塊提供過載。軟件中的每一層應提供一個或多個此配置模塊。正如Kirk上面所說的,你不需要/想直接在第一層引用內核來請求服務,服務應該被注入到1。 –