我有一個具有與Ninject連接的依賴關係的類。在類庫中創建Ninject內核
public interface IFoo {}
public class MyObject {
[Inject]
IFoo myfoo;
}
在真正的實現中,我使用屬性注入,但只是爲了快速說明,我將注入該字段。按照我的理解,而不是爲MyObject的newing情況下,爲了獲得依賴於正確地注入,我需要使用
kernel.Get<MyObject>()
但是我跌跌撞撞的事情是,爲MyObject將只在使用類庫的上下文。目的是讓最終應用程序創建自己的模塊並將其傳遞到內核實例中進行保溼。鑑於此,通常最實用的方法是將一個Ninject內核的通用實例展示給我的類庫,以便MyObject(以及其他類似案例)的實例可以被水合?
我的第一個傾向是某種內部化單體內核的工廠 - 應用程序本身必須通過加載模塊來進行水合/初始化。
所以在RandomService.cs
var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();
我走的太遠了這條路,雖然之前,我需要做一個全面的檢查,以確保思想是健全或不存在一些明顯的其他我錯過的東西。對於IoC來說,我顯然是新手,並且覺得我非常喜歡基礎知識,但不一定是現實世界中最好的方式。
幸運的是,這是一個內部(在公司的意義上)lib,所以我有一個被俘的觀衆 - 我的團隊中的其他開發人員使用標準工具。現在,每個開發者可能有不同的綁定他們想要的,因此我原來的困惑。 回覆:ctor vs道具注入,道具看起來似乎有很多我不得不寫的東西,但是我擔心隨着時間的推移依賴列表不斷增長,因此ctor調用。是否有其他缺點支持注射我應該注意? – bakasan 2010-02-11 08:50:19
即使使用內部應用程序,我仍然會遵循相同的原則,因爲它們會導致更清晰的代碼,更好地分離問題。注入屬性有許多潛在的問題,包括保護不變量(是依賴項null?),可能會熱插拔注入的依賴項(可能不是您想要執行的操作)以及一般更模糊的API。 – 2010-02-11 09:08:41
哦,只是爲了預先考慮並明確表示:我認爲服務定位器是一種反模式:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – 2010-02-11 09:10:18