我有一个 IRepository 接口,其中包含许多 T 和多个实现(按需数据库、Web 服务等)。我使用 AutoFac 为许多 T 注册 IRepository,具体取决于我想要为每个 T 指定的存储库类型。
我还有一个基于 .NET 缓存的实现,它在缓存中查找 T,然后调用“真正的”IRepository.Find 来解决缓存未命中问题。它的构造是这样的:
new CachingRepository(realRepository, cacheImplementation);
我想使用配置标志来决定 AutoFac 是否提供基于缓存的 IRepository 或“真实的东西”。看起来“realRepository”来自于要求 AutoFac 解析 IRepository ,但是当客户端要求解析相同的接口时,他们会得到什么?如果设置了标志,我希望他们获得 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>());
上面的代码只会读取一次缓存配置。您还可以包括GetCacheConfigSetting()
在注册委托中。这将导致每次检查该设置Resolve
(假设InstancePerDependency
).
其他选项:Autofac 装饰器和模块
Autofac 还有一些更高级的功能您可能也会觉得有用。您问题中的缓存类是一个示例装饰模式 http://en.wikipedia.org/wiki/Decorator_pattern. Autofac 对装饰器有明确的支持 http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4/。它还有一个很好的模型,用于构建注册和管理配置信息,称为Modules http://code.google.com/p/autofac/wiki/StructuringWithModules.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)