domain-driven-design - 用标志交换存储库

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

我有一个 IRepository 接口(interface),其中包含许多 T 和多个实现(按需数据库、Web 服务等)。我使用 AutoFac 为许多 T 注册 IRepository,具体取决于我想要为每个 T 指定的存储库类型。

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

new CachingRepository(realRepository, cacheImplementation);

我想使用配置标志来决定 AutoFac 是否提供基于缓存的 IRepository 或“真实的东西”。看起来“realRepository”来自于要求 AutoFac 解析 IRepository ,但是当客户端要求解析相同的接口(interface)时,他们会得到什么?如果设置了标志,我希望他们获得 CachingRepository。

我不知道如何实现这个基于标志的解决方案。有什么想法吗?

最佳答案

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

有多种方法可以做到这一点。在注册委托(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/

相关文章:

java - DDD : status - Value Object or Entity?

dependency-injection - MEF(托管可扩展性框架)与 IoC/DI

Angular 服务注册到容器但未指定 "providedIn"

c# - 将 Autofac 的 ReplaceInstance 与接口(interface)类型一起使用

c# - Autofac BeginLifetimeScope

domain-driven-design - DDD 聚合中的对象引用与 Id 引用

inheritance - DDD : aggregate root specialization

datatable - 对于搜索/报告数据表或 DTO 或域类,您更喜欢哪一个?

inversion-of-control - 将结构映射与 log4net 包装器一起使用

c# - 使用 AutoFac 根据构造函数参数名传递不同的实例