2017-04-26 53 views
0

我們有一個控制檯應用程序,它執行許多不同的事情。很多不同的事情,它的作用取決於我們作爲命令行參數傳入的內容。它最初是以這種方式構建的,所以它只在我們的構建服務器中佔用了一個許可位置,並且在提出拆分時遇到了一些阻力。SimpleInjector - 「Lazy」實例化一個具有第一次使用依賴關係的單例

這個應用程序使用SimpleInjector的IoC ...問題是,我們有一堆單身人士的服務,沒有用於任何給定的操作,並且他們加載每次使用...這是令人生厭的慢。我只想加載實際用於任何給定操作的依賴關係。

看起來好像圍繞着Lazy<TService>有很多文檔,但實際上很令人沮喪。看來懶惰的構造函數並不知道它正在使用的容器,所以它必須使用無參數的構造函數或價值工廠,它似乎也不知道依賴項所在的容器。

是我想做的事SimpleInjector?我一直在玩Lazy generic的各種版本,但我似乎無法得到我想要的。

+0

「我們有一堆單獨的服務不用於任何給定的操作,並且每次使用都會加載......這太令人厭煩了。」這是你要詳細說明的,因爲Simple Injector速度很快,並且類的創建[應該很快](http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)。爲什麼這很慢? – Steven

+0

@Steven單例類本身很慢實例化。其中許多是API消費者,它從遠程站點收集身份驗證令牌或其他內容,或者在內部構建緩存。 –

+0

我想(再次)參考[這篇文章](http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)。你不應該在構造函數中做任何計算相關性。如果你需要建立一個緩存,那就懶洋洋地去做吧:不是在建設過程中。 – Steven

回答

3

SimpleInjector允許你register factory delegates

// From the link above, chapter "Lazy" 
container.Register<Lazy<IMyService>>(
    () => new Lazy<IMyService>(container.GetInstance<RealService>)); 

另一種可能性是使用decorator。 SimpleInjector也可以讓你做到這一點。與第一種解決方案相比(您必須致電lazyService.Value.DoSomething();)的優勢是,您可以使此更改變得透明。即裝飾器實現了服務,你可以撥打decoratedService.DoSomething();

+0

從我讀的內容來看,這需要我在我的單例類中注入'Lazy '作爲依賴項,這會將我的服務耦合到SimpleInjector。這不正確嗎? –

+2

'System.Lazy '是一個.NET類;沒有什麼特別針對'懶惰'的簡單噴射器。 – Steven

+0

我......沒有意識到這一點。我會仔細看看的。 –

相關問題