n8w*_*wrl 2 domain-driven-design inversion-of-control autofac
我有一个IRepository <T>接口,有许多T和几个实现(按需DB,Web服务等).我使用AutoFac为许多T注册IRepository,具体取决于我想要的每个T的存储库类型.
我还有一个基于.NET缓存的实现,它在缓存中查找T,然后调用"真正的"IRepository.Find来解决缓存未命中问题.它构造如下:
new CachingRepository(realRepository, cacheImplementation);
Run Code Online (Sandbox Code Playgroud)
我想使用配置标志来决定AutoFac是否提供基于缓存的IRepository或"真实的东西".似乎'realRepository'来自要求AutoFac解析IRepository <T>但是当客户要求解析同一个接口时会得到什么?如果设置了标志,我希望它们获取CachingRepository.
我无法理解如何实现这种基于标志的解决方案.有任何想法吗?
最简单的选择:条件注册代表
有很多方法可以做到这一点.在注册委托中使用缓存设置可能是最简单的(并说明了委托注册的功能):
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>());
Run Code Online (Sandbox Code Playgroud)
上面的代码只会读取缓存配置一次.您还可以GetCacheConfigSetting()在注册代表中包含该内容.这将导致每次Resolve(假设InstancePerDependency)检查设置.
其他选项:Autofac装饰器和模块
Autofac还有一些更高级的功能,您也可以发现它们很有用.您问题中的缓存类是Decorator模式的一个示例. Autofac明确支持装饰器.它还有一个很好的模型,用于构建注册和管理配置信息,称为模块.