我正在嘗試Ninject,並且正在修改我用Structure Map編寫的代碼以查看它是多麼容易。在這個基本代碼中,我有一個通過結構映射註冊表具有不同配置的對象圖,並且在運行時通過數據庫中的值選擇要使用的對象(在這種情況下,注入一些對象來撤回wcf服務主體) 。例如(使用結構圖代碼):使用名稱來區分使用IoC的實例
註冊表1設置IBusinessContext,IRules和ILogger類型的所有默認值。這只是將GenericContext/Logger/Rules類型添加到接口中而沒有其他專業化。
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
註冊2臺達IBusinessContext使用SpecialisedContext類,並告訴使用SpecializedLogger的構造函數。 IBusinessContext的實例名爲「SpecializedContext」。
public SpecializedRegistry()
{
// Old style syntax as it affects the default for IBusinessContext
// Perhaps a hint at what I'm doing?
InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
}
這一切都按預期的方式在結構圖中工作(取決於舊的或新的語法)。
但是,當我使用Ninject時,我遇到了一個問題,期望未命名的實例是默認的(不是Ninject如何工作,我知道)。這導致了一些研究,這些研究都表明使用命名實例是一個非常糟糕的想法。我知道有更好的方法來做到這一點,使用自動註冊或屬性來設置一個名稱或請求某種類型,但在我所描述的系統中,需要有一種方法來在運行時找出要求的配置在樹的頂部(並且讓IoC框架根據註冊類型或規則找出其餘部分)。
所以......我剛剛使用IoC概念錯誤在這裏期望按名稱詢問我的頂級對象,或者通常有更好的方法來做我想做的事情嗎?我是否應該使用像MEF這樣的東西,並將其全部像插件一樣對待?
我強調我沒有像這樣使用啞工廠,並在代碼的每個級別詢問容器中類型爲x的實例,它僅僅是啓動操作。
預先感謝您的時間和幫助:)
謝謝Aaron!這爲我清除了一些東西:)非常感謝。 – NoodleAwa 2012-02-15 14:58:37