使用标志交换存储库

时间:2011-06-03 10:57:09

标签: domain-driven-design inversion-of-control autofac

我有一个IRepository< T>与许多T和几个实现(按需DB,Web服务等)的接口。我根据每个T所需的存储库类型,使用AutoFac为许多T注册IRepository。

我还有一个基于.NET缓存的实现,它在缓存中查找T,然后调用“真正的”IRepository.Find来解决缓存未命中问题。它的构造类似于:

new CachingRepository(realRepository, cacheImplementation);

我想使用配置标志来决定AutoFac是否提供基于缓存的IRepository或“真实的东西”。似乎'realRepository'来自要求AutoFac解析IRepository< T>但是当客户要求解决相同的界面时,客户会得到什么?如果设置了标志,我希望他们获取CachingRepository。

我无法理解如何实现这种基于标志的解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

最简单的选项:条件注册代表

有很多方法可以做到这一点。在注册代理中使用缓存设置可能是最简单的(并说明了委托注册的强大功能):

var builder = new ContainerBuilder();

bool cache = GetCacheConfigSetting(); //Up to you where this setting is.    

builder.Register(c => cache ? (IRepository<string>)new CachingRepository<string>(new RealRepos<string>(), new CacheImpl()) : new RealRepos<string>());

上面的代码只会读取缓存配置一次。您还可以在注册代理中包含GetCacheConfigSetting()。这将导致每个Resolve检查设置(假设为InstancePerDependency)。

其他选项:Autofac装饰器和模块

Autofac还有一些更高级的功能,您可能会发现它们很有用。您问题中的缓存类是Decorator Pattern的示例。 Autofac has explicit support for decorators。它还有一个很好的模型,用于构建注册和管理配置信息,称为Modules