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