我有一个IRepository< T>与许多T和几个实现(按需DB,Web服务等)的接口。我根据每个T所需的存储库类型,使用AutoFac为许多T注册IRepository。
我还有一个基于.NET缓存的实现,它在缓存中查找T,然后调用“真正的”IRepository.Find来解决缓存未命中问题。它的构造类似于:
new CachingRepository(realRepository, cacheImplementation);
我想使用配置标志来决定AutoFac是否提供基于缓存的IRepository或“真实的东西”。似乎'realRepository'来自要求AutoFac解析IRepository< T>但是当客户要求解决相同的界面时,客户会得到什么?如果设置了标志,我希望他们获取CachingRepository。
我无法理解如何实现这种基于标志的解决方案。有什么想法吗?
答案 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。