我讀過許多關於在開發中使用IoC容器的有趣文章。在許多情況下,作者建議我們寫自己的簡單的包裝裏面隱藏的接口,像Ninject,Castle.Windsor,統一等在自己的抽象中使用IoC高級功能
包裝的實現看起來像這樣(爲Ninject)讀取容器:
/// <summary>
/// Contains links for service contract and realization.
/// </summary>
public static class IoC
{
static readonly IKernel kernel;
static IoC()
{
kernel = new StandardKernel();
}
public static void RegisterService<T>(Type service)
{
kernel.Bind<T>().To(service);
}
public static T Resolve<T>()
{
return kernel.Get<T>();
}
}
好的,但是如何使用這種模式的高級功能?例如,我喜歡使用InRequestScope()或InSingletonScope()等生命週期管理修飾符,並且許多容器都支持相同的修飾符。隨着上述模式,我可以扔掉ninject並使用15-lines implementation。區別在哪裏?
我也看着CommonServiceLocator試圖找到豐富的包裝,但它與我的IoC類沒有太大的區別。 現在我認爲我不應該自己製作自行車並直接使用全功能容器。你呢?
做的人轉而多久容器?這真的很常見嗎?無論如何,你的類不應該依賴於容器,所以替換它應該很容易,抽象與否,不是嗎? –
通常,沒有理由將您的DI容器抽象出來,因爲您應該只在組合根中使用它。其他一切都被稱爲[服務定位器反模式](http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx),應該避免。 –
@R。 Martinho費爾南德斯:我FWIW交換容器中一個相當大的活代碼庫最近一個星期,但承認有些事情不是我做的每一個* *星期:) –