0

我有接口IA和實現A:IAB:IAB實現依賴IA與構造函數DI,因此B.ctor(IA)包裝類的IoC註冊

此設計的目的是將AB包裝在一起,並允許它們互換使用。 A是數據庫的適配器,B允許緩存該數據。

IA也依賴於此係統中的提供者類,因此當我註冊這些提供者時,我想使用B的實例。我的對象圖應該基本上如下所示:

new Provider(
    new B(
     new A(
      new DbContex("constr") 
     ) 
    ) 
) 

我一直在使用的標記接口,這樣IB:IAB:IB考慮,但我需要依靠IB我的供應商,而不是IA這不是很理想。

我也考慮過使用IA的工廠,它使用A的實例創建B的實例,但感覺不對。

所以我想我正在尋找一些方法來完成使用simpleinjector IoC容器的註冊。

示例代碼

public class A : IA 
{ 
    private readonly DbContext _context; 

    public A(DbContext context) 
    { 
     _context = context; 
    } 

    public T Get<T>() 
    { 
     // Do stuff to get and 
     // return value from database. 
    } 

    public void Set<T>(T value) 
    { 
     // Do stuff to set value 
     // in database. 
    } 
} 

包裝類:

消費者的 IA
public class B : IA 
{ 
    private readonly IA _adapter; 

    public B(IA adapter) 
    { 
     _adapter = adapter; 
    } 

    public T Get<T>() 
    { 
     // Do stuff to get and 
     // return value from cache 
     // or database adapter. 
    } 

    public void Set<T>(T value) 
    { 
     // Do stuff to set value 
     // in cache and database. 
    } 
} 

public class Provider 
{ 
    private readonly IA _adapter; 

    public Provider(IA adapter) 
    { 
     _adapter = adapter; 
    } 
} 

回答

3

你要尋找的是被稱爲decorator pattern

簡單的噴油器有很好的應用裝飾器的支持,可能是與其他主流IoC容器相比最好的支持。

您可以在這裏閱讀有關裝飾器子系統的所有信息: Aspect-Oriented Programming在文檔中。

對於這個基本的情況下所需的註冊是直截了當:

container.Register<IA, A>(); 
container.RegisterDecorator<IA, B>(); 

而且不要忘記B.

+0

奇妙的構造函數把「IA」!非常感謝 :) – Ablue