包装类的IoC注册
问题描述:
我有接口IA
和实现A:IA
和B:IA
。 B
实现依赖IA
与构造函数DI,因此B.ctor(IA)
。包装类的IoC注册
此设计的目的是将A
与B
包装在一起,并允许它们互换使用。 A
是数据库的适配器,B
允许缓存该数据。
IA
也依赖于此系统中的提供者类,因此当我注册这些提供者时,我想使用B
的实例。我的对象图应该基本上如下所示:
new Provider(
new B(
new A(
new DbContex("constr")
)
)
)
我一直在使用的标记接口,这样IB:IA
和B: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;
}
}
答
你要寻找的是被称为decorator pattern。
简单的喷油器有很好的应用装饰器的支持,可能是与其他主流IoC容器相比最好的支持。
您可以在这里阅读有关装饰器子系统的所有信息: Aspect-Oriented Programming在文档中。
对于这个基本的情况下所需的注册是直截了当:
container.Register<IA, A>();
container.RegisterDecorator<IA, B>();
而且不要忘记B.
奇妙的构造函数把“IA”!非常感谢 :) – Ablue