用标志交换存储库

2024-01-24

我有一个 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(使用前将#替换为@)

用标志交换存储库 的相关文章

随机推荐

  • NetworkInterface.GetIPv4Statistics().BytesReceived - 它返回什么?

    该特定字段返回什么 我想要每秒接收的字节数 我应该依赖这个吗 我认为你可以这样使用它 long beginValue NetworkInterface GetIPv4Statistics BytesReceived DateTime beg
  • 比较 NumPy 数组的相似性

    我有一个形状为 300 的目标 NumPy 数组和一组形状也为 300 的候选数组 这些数组是单词的 Word2Vec 表示 我试图使用向量表示找到与目标单词最相似的候选单词 找到与目标词最相似的候选词的最佳方法是什么 一种方法是将目标词与
  • 在同一控制器 Laravel 中将变量从一种方法传递到另一种方法

    我需要从存储方法传递选择选项值来显示 我需要通过 typeg值显示方法 public function store Request request typeg request gt input type public function sh
  • 如何制作可运行的jar文件?

    我使用了一个程序来制作可运行的 jar 文件 我现在找到的所有程序都是制作 exe 文件的程序 我记得它还可以选择将文件制作为 sh 脚本 有人知道它的名字吗 我已经搜索了几个小时但没有结果 命令行 java jar file jar 将运
  • Android WebView - 重置 HTTP 会话

    我在 Android 应用程序中使用 WebView 我定期能够重置 WebView http 会话 以便它正在访问的服务器应用程序将初始化一个新会话 我找不到如何做到这一点 这可能吗 Rgds 凯文 我认为清除cookie可以使会话关闭
  • 显示 Visual Studio 代码中的所有警告和错误

    我正在使用 Visual Studio Code 版本 1 6 0 是否有可能显示当前根文件夹中所有文件的错误和警告 目前它仅显示打开文件的错误和警告 2019年更新 ESLint 在 VS Code 中引入了一项新任务 您必须在工作区设置
  • 使用 mschart 在数据点上设置标签

    我想自定义下面数据点上的标签 以便它们呈现为 使用图表上的第一个数据点作为示例 4 10 4 40 黄色类 数据点有一个可以通过编程方式设置的标签属性 DataPoint dp new DataPoint dp Label c Start
  • R XML 从同一节点选择 2 个属性 xmlAttrs()

    进一步推进 TEI 勘探 这是我的 XML Tei 文件 其中包含具有不同属性 时间 从 到 的 日期 节点 我已经使用成功提取了 when 属性的值 dateWhen lt unlist xpathApply doc date xmlGe
  • 情节内的情节

    我有情节1 curve exp x from 1 to 5 lwd 5 curve 150 exp x from 1 to 5 lwd 5 col darkblue add T 在其中我想添加以下情节 2 par mar c 7 7 1 1
  • 是否有任何理由不将 'git fetch' 设置为始终使用 --prune 选项?

    当远程计算机上的分支已被删除时 使用 git fetch prune 删除本地远程跟踪分支 使用以下命令将remote origin prune设置为true git config global fetch prune true 使得使用
  • Git 忽略除某个目录的所有子目录之外的所有特定类型的文件?

    我正在尝试创建一个 gitignore 文件 该文件将忽略所有 jar 文件 除非它们位于名为 libs 的文件夹中 这是我的基本文件结构 gitignore libs goodFile jar someFolder subFolder a
  • 如何在 firebase 托管中包含子目录

    我的网站由主页和文件夹内分隔的子页面组成 如何在我的页面主机中包含子页面 firebase 托管 弗兰克的评论确实是一个答案 Firebase 会在您指定的目录下部署所有内容 因此 如果您的主页 index html 位于当前目录中 而其他
  • TCP RST 数据包详细信息

    为什么 TCP RST 数据包不需要确认 是不是因为RST的发送方每次收到对方的数据包后都会继续发送RST 相关说明 有效的 RST 数据包中的确认号怎么可能是 0 相关说明 RST 数据包中的确认号如何 是 0 因为设置了 RST 位的段
  • 添加千分尺依赖项会导致奇怪的 Spring 代理问题

    我有一个带有私有 Scheduled 方法的简单 Spring Boot 应用程序 SpringBootApplication EnableScheduling public class DemoApplication public sta
  • 为什么 Random.nextLong 不能在 Java 中生成所有可能的 long 值?

    Random 类的 nextLong 方法的 Javadoc 指出 由于 Random 类仅使用 48 位的种子 因此该算法不会返回所有可能的长值 随机javadoc http docs oracle com javase 7 docs a
  • java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection

    我得到以下信息 java lang ClassCastException com mchange v2 c3p0 impl NewProxyConnection 当下面的代码执行时 你能帮我解决一下吗 ComboPooledDataSour
  • jQuery 动画颜色变化

    我正在尝试将链接颜色从当前颜色更改为其他颜色的动画 window load function article preview h1 a hover function this animate color ffffff 1500 由于某种原因
  • 比较两个日期时间

    label1显示我通过查询从数据库获取的最后交易日期 时间 label2是系统日期 时间 我有一个执行命令按钮的计时器 之后我想检查 label1 中的日期 时间是否小于 5 分钟 如果是这样的话我想展示一下按摩 但我不知道为什么我的代码无
  • 使用phonegap在android模拟器中调试javascript

    我是phonegap 和android 开发的新手 我可以知道如何在模拟器上调试 javascript 错误吗 我听说过 ADB 请问我如何在 Windows 7 系统上使用和安装它 我有一个使用 jsonp 调用的 ajax 但模拟器上没
  • 用标志交换存储库

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