假设我有一个用于获取数据的接口及其实现:
interface IResourceProvider
{
string Get( Uri uri );
}
class HttpResourceProvider : IResourceProvider
{
public string Get( Uri uri )
{
// Download via HTTP.
}
}
我可以在Castle Windsor注册,如下所示:
container.Register
( Component.For<IResourceProvider>().ImplementedBy<HttpResourceProvider>()
);
(一切都很好)。
如果我然后决定我想要一个缓存实现如下:
class CachingResourceProvider : IResourceProvider
{
public CachingResourceProvider( IResourceProvider resourceProvider )
{
_resourceProvider = resourceProvider;
}
public string Get( Uri uri )
{
// Return from cache if it exists.
// Otherwise use _resourceProvider and add to cache.
}
private readonly IResourceProvider _resourceProvider;
}
我将如何注册这些嵌套的依赖项?即,我想说IResourceProvider
由CachingResourceProvider
实现,除了在构造函数中的位置,它是{ {1}}。
答案 0 :(得分:5)
只需在CachingResourceProvider
之前注册HttpResourceProvider
- 例如
container.Register(Component
.For<IResourceProvider>()
.ImplementedBy<CachingResourceProvider>());
container.Register(Component
.For<IResourceProvider>()
.ImplementedBy<HttpResourceProvider>());
BTW - 这被称为Decorator设计模式。
答案 1 :(得分:1)
这被称为装饰模式...
请参阅此链接作为示例:http://mikehadlow.blogspot.com/2010/01/10-advanced-windsor-tricks-4-how-to.html