Autofac 具有同一接口的多个实现

2023-12-30

我正在使用 Autofac,并且希望有一个接口的多个实现。如何配置 Autofac 以便根据当前类型解决依赖关系?

更具体地说,我有一个接口和多个应该链接在一起的实现。

让我解释一下(虚构的类):

public interface IMessageHandler
{
    void Handle(Message message);
}

public class LoggingMessageHandler : IMessageHandler
{
    private IMessageHandler _messageHandler;

    public LoggingMessageHandler(IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }

    public void Handle(Message message) 
    {
        // log something
        _messageHandler.Handle(message);
    }
}

public class DoSomethingMessageHandler : IMessageHandler
{
    private IMessageHandler _messageHandler;

    public DoSomethingMessageHandler (IMessageHandler messageHandler)
    {
        _messageHandler = messageHandler;
    }

    public void Handle(Message message) 
    {
        // do something
        _messageHandler.Handle(message);
    }
}

链的底部可能是IMessageHandler这不会将消息传递给下一个。

如果我想要以下链:

TopLevelClass -> LoggingMessageHandler -> DoSomethingMessageHandler -> FinalHandler

我如何告诉 Autofac

  • pass LoggingMessageHandler to TopLevelClass(以满足其对IMessageHandler)
  • pass DoSomethingMessageHandler to LoggingMessageHandler(以满足其对IMessageHandler)
  • pass LoggingMessageHandler to FinalHandler(以满足其对IMessageHandler)

是否有可能(我读过有关对 IEnumerable 的隐式支持 https://code.google.com/p/autofac/wiki/RelationshipTypes#Example%3a_Implicit_IEnumerable_Support)?或者我必须在两者之间使用额外的类(工厂或其他东西)?


Autofac 默认隐式支持此功能 https://docs.autofac.org/en/latest/resolve/relationships.html#enumeration-ienumerable-b-ilist-b-icollection-b通过使用IEnumerable<T> https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1。而不是让依赖类的构造函数接受单个实例T,你让它在一个实例中IEnumerable<T>这将包含每一个T挂号的:

public interface IMessageHandler
{
    void HandleMessage(Message m);
}

public class MessageProcessor
{
  private IEnumerable<IMessageHandler> _handlers;

  public MessageProcessor(IEnumerable<IMessageHandler> handlers)
  {
      _handlers = handlers;
  }

  public void ProcessMessage(Message m)
  {
      foreach (var handler in _handlers)
      {
          handler.HandleMessage(m);
      }
  }
}

然后在您的注册中,只需添加多个实现T:

var builder = new ContainerBuilder();
builder.RegisterType<FirstHandler>().As<IMessageHandler>();
builder.RegisterType<SecondHandler>().As<IMessageHandler>();
builder.RegisterType<ThirdHandler>().As<IMessageHandler>();
builder.RegisterType<MessageProcessor>();

When MessageProcessor被实例化后,IEnumerable根据上述注册,它收到的将包含三个项目IMessageHandler.

您可以在我的博客上阅读更多相关内容。 http://www.whoiskevinrich.com/using-dependency-injection-for-implementation-enumeration

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autofac 具有同一接口的多个实现 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • Haskell中的IO类型是什么

    我是 Haskell 编程语言的新手 我一直在绊倒IOtype 作为函数参数或返回类型 playGame Screen gt IO OR gameRunner IO String gt String gt IO gt Screen gt I
  • jQuery UI 2 日期选择器和范围选择

    我正在尝试连接 2 个日期选择器以允许用户选择日期范围 我创建了这样的代码 function var dates fromDate toDate datepicker dateFormat yy mm dd changeMonth true
  • 使用向量和对的邻接列表图表示

    我想实现竞争性编程 1 书中的邻接列表图表示 该实现使用 V 顶点的向量 并且对于每个顶点 v 另一个 包含有连接的对 相邻顶点及其边权重 的向量 v 我在获取该图的输入并显示输出时遇到问题 在书中 他们做了这样的声明 include
  • Eclipse 格式化程序在空注释行中添加空格

    Eclipse 代码格式化程序在每个空 Javadoc 注释行中添加一个尾随空格 请参见屏幕截图 同事的格式化程序总是删除这些空格 从而产生恼人的 SVN 差异 他声称使用相同的格式化程序设置 XML 文件 尽管如此 我尝试了格式化程序设置
  • 是否可以检测文本何时换行?

    是否可以检测文本换行的位置 Lorem ipsum dolor 坐 amet 假设上面的文本在 dolor 一词之后换行 如何检测到它并在那里插入一些标记 这样它就可以了Lorem ipsum dolor div class wrap ma
  • 如何在 swift 2.2 中休眠几毫秒?

    请有人告诉我如何在 swift 2 2 中使用 sleep 几毫秒 while true print sleep for 0 002 seconds sleep 0 002 not working but while true print
  • R 地图()中的县 FIPS 准确吗?

    当我运行以下代码时 require maps colors lt data frame county county fips polyname color rep FFFFFF nrow county fips stringsAsFacto
  • UWP Navigation通过 MVVM 进行视图导航

    我在我的应用程序中使用 NavigationView 作为主控件 并在页面加载时使用框架
  • 如何暂停和恢复jquery间隔

    我用 jQuery 制作了一个自定义滑块 为此 我使用了 setInterval 函数 timer setInterval function 8000 但我无法暂停和恢复间隔 我有 2 个按钮 播放 暂停 我想使用 假设我在 3 秒后单击
  • 如何从项目级别指定 --add-opens 并确保无论以何种方式运行我的应用程序都将其考虑在内?

    我最近迁移到 Java 17 随之而来的一些限制要求我使用 add opens因为运行我的应用程序时存在一个依赖项 当我需要添加这个java jar命令已运行 现在我找到了这些解决方案 我可以将其添加到运行该项目的 Dockerfile 中
  • Oracle SQL 全外连接

    我使用 FULL OUTER JOIN 连接 2 个表 运行并给出输出需要 6 分钟 SELECT FROM tab1 FULL OUTER JOIN tab2 ON tab1 id tab2 id 我使用 LEFT OUTER JOIN
  • 从 eclipse+gradle 运行时,Spring Boot 错误地加载测试配置

    当我从 Eclipse STS 作为 Java 应用程序 或 Spring Boot 应用程序 运行 Spring Boot 应用程序时 该应用程序失败 因为它尝试从以下位置加载配置 Configuration 测试类路径 问题是它适用于基
  • 将 C++11 与 2013 年左右编译器一起使用的选项

    是否有任何完整 正确的实施可用 现在 对于 C 11 正则表达式 关于编译器支持与库支持的注意事项 编译器支持 编译器可以识别针对相关功能添加到语言中的任何新语法 利用添加到程序中的新功能的代码将进行编译 图书馆支持 更新库以实际实现该功能
  • 重新排序时 UITableViewCell 的子视图不可见

    当我重新排序 UITableViewCells 时 拖动时单元格的子视图不可见 无论我在 UITableViewCell 子类中还是在 Storyboard 中以编程方式添加子视图 我总是得到相同的结果 拖动时是否有可能看到带有子视图的真实
  • JMeter分布式测试和命令行参数

    我一直在使用 JMeter 参数来指定负载测试的测试属性 例如 testduration rampup period 等 我在 shell 脚本中指定这些参数 它看起来像这样 JMETER PATH home
  • VB.NET:VB.NET 中的静态 T (C#) 是什么?

    考虑 public static T GetValueOrDefault
  • 程序集/Nasm - 分段错误(核心转储)错误

    我对 NASM 很陌生 我正在尝试执行我找到的在线 MASM 示例 但转换为 NASM 很痛苦 它正确编译并生成输出文件 但是当我尝试运行它时 它给出了分段错误 核心转储错误 我不知道它是什么 操作系统是Ubuntu 尝试在以下环境下执行编
  • 通配某些 YYYYMMDD 日期

    我正在尝试向我的 perl 脚本提供几个文件按日历周 它只是获取从 bash 获取的所有文件 foreach my input ARGV 命名约定如下 FILE XYZ 20140908 0000 000XYZ 这个月的第一周没问题 FIL
  • 无法导出 Kendo Grid 中的隐藏列

    我想隐藏 Kendo Grid 上的一些列并将它们导出到 Excel 作为可见列 然而 使用隐藏 真实 or 可见 假 没有任何意义 并且这些字段不会被导出 解决方法this http www telerik com forums exce
  • Autofac 具有同一接口的多个实现

    我正在使用 Autofac 并且希望有一个接口的多个实现 如何配置 Autofac 以便根据当前类型解决依赖关系 更具体地说 我有一个接口和多个应该链接在一起的实现 让我解释一下 虚构的类 public interface IMessage