我有一個項目,我想使用緩存幾個接口。依賴注入和緩存類最佳實踐
這是最好的方法是什麼?我有兩個考慮:
兩個緩存和非緩存類將實現相同的接口
public interface IFoo { object Get(); } public class Foo : IFoo { public object Get() { // return something from datasource return null; } } public class FooCached : IFoo { private readonly IFoo fooService; public FooCached(IFoo fooService) { this.fooService = fooService; } public object Get() { // check cache and if empty load the value using fooService (Foo class) return this.fooService.Get(); } }
每個實施將有自己的接口(儘管在這種情況下,它基本上是同一個只是用不同的名字)
public interface IFoo { object Get(); } public interface IFooCached : IFoo { } public class Foo : IFoo { public object Get() { // return something from datasource return null; } } public class FooCached : IFooCached { private readonly IFoo fooService; public FooCached(IFoo fooService) { this.fooService = fooService; } public object Get() { // check cache and if empty load the value using fooService (Foo class) return this.fooService.Get(); } }
我個人比較喜歡第一種方法更多。在這種情況下,我不太喜歡接口繼承,並且由於這兩個類基本上是相同的,只是稍微有點不同,我覺得他們應該有相同的接口。
但是,由於沒有「簡單」的方法,我可以看到使用Unity來實現這一點,我不確定這是否是最好的方法。 基本上我需要將IFoo解析爲FooCached,除了FooCached本身,我需要Foo。 (我知道我是如何完成這項工作的,例如使用命名註冊和爲FooCached指定InjectionConstructor,但這可能不在此問題的範圍之內)。另一方面,第二個是非常容易安裝的。
這個問題主要是基於意見的(或者更多關於點,它是基於需求的),這使得它[在StackOverflow上脫離主題](http://stackoverflow.com/help/dont-ask)。此外,它被歸類爲依賴注入,這不適用於此 - 這是一個純粹的基於設計模式的問題。 DI容器不是緩存,儘管它可能使用一個實現其生活方式行爲。 – NightOwl888
你應該使用第一種方法,並進行谷歌搜索「Unity裝飾模式」。你會發現幾個博客文章和Stackoverflow的答案,展示瞭如何向Unity註冊裝飾器。 – Steven
當你開始爲同一界面開發多個實現時(如你的第一種方法是正確的),DI容器開始成爲IMO的方式。有關更多詳細信息,請參閱[本文](http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/。)。另一種選擇是[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)。 –