我有一个 IRepository
我还有一个基于 .NET 缓存的实现,它在缓存中查找 T,然后调用“真正的”IRepository.Find 来解决缓存未命中问题。它的构造如下:
new CachingRepository(realRepository, cacheImplementation);
我想使用配置标志来决定 AutoFac 是否提供基于缓存的 IRepository 或“真实的东西”。看起来“realRepository”来自于要求 AutoFac 解析 IRepository
我不知道如何实现这个基于标志的解决方案。有什么想法吗?
最佳答案
最简单的选项:有条件注册代理
有多种方法可以做到这一点。在注册委托(delegate)中使用缓存设置可能是最简单的(并说明了委托(delegate)注册的强大功能):
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>());
上面的代码只会读取一次缓存配置。您还可以在注册委托(delegate)中包含 GetCacheConfigSetting()
。这将导致在每个 Resolve
上检查设置(假设 InstancePerDependency
)。
其他选项:Autofac 装饰器和模块
Autofac 还有一些更高级的功能您可能也会觉得有用。您问题中的缓存类是 Decorator Pattern 的示例。 Autofac has explicit support for decorators 。它还有一个很好的模型,用于构建注册和管理配置信息,称为 Modules .
关于domain-driven-design - 用标志交换存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6226194/