Autofac复合图案

2023-11-25

我注意到我经常需要实现复合模式。例如:

interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
    public CompositeService(IEnumerable<IService> services) { ... }
    ...
}

我想在容器中将 CompositeService 注册为 IService 并注入依赖项。

(看起来有点类似于装饰器,但装饰一组服务而不是仅装饰一个服务)

在 autofac 中最好的方法是什么?

理想的解决方案是什么样的(对于 C#)?

Update:

我当前的注册是:

builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
    .As<IService>();

它类似于手工装饰 in http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

可以改进吗?


我还没有实现这个,甚至没有完全考虑过它,但我能实现的最好的语法是:

builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");

The elements注册函数的参数类型为IEnumerable<IService>并封装c.Resolve<IEnumerable<IService>>("impl").

现在该怎么写呢...

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

Autofac复合图案 的相关文章

随机推荐

  • 如何在字符串中使用反斜杠 (\)?

    我尝试了很多方法来获得单反斜杠从一个executed 我的意思不是来自的输入html 我可以得到特殊字符作为制表符 新行和许多其他内容 然后将它们转义为 t or n or someother character 但当 a 时我无法得到一个
  • 如何判断 Chrome 扩展是由真实用户安装还是由我在开发过程中安装?

    我在 Chrome 扩展程序中使用 Analytics 我只想在真人 不是我正在使用它时 使用扩展时才执行分析代码 以下任何一项是否可行 哪一项是最好的 确定扩展是打包安装还是解包安装 我认为这是最好的 因为解压显然意味着它 正在开发中 并
  • 值限制:类型“bar”已被推断为具有泛型类型

    在下面的代码片段中 我不明白为什么我必须撰写f and g方式函数foo可以以及为什么它不能按功能方式工作bar尝试去做 let f a b a b let g a a b a a let gt f1 f2 fun a b gt let x
  • 在类型 ' 上找不到带有类型 'string' 参数的索引签名

    我正在开发我的第一个 firebase typescript 函数项目 我有以下代码片段 const files status src api status f js invite src api invite f js user src
  • 如何将java序列化对象写入和读取到文件中

    我将把多个对象写入一个文件 然后在代码的另一部分检索它们 我的代码没有错误 但无法正常工作 您能帮我找出我的代码有什么问题吗 我从不同的网站阅读了不同的代码 但没有一个对我有用 这是我将对象写入文件的代码 MyClassList 是一个数组
  • 按下按钮时播放声音 - android

    我有这个代码 package com tct soundTouch import android app Activity import android media MediaPlayer import android os Bundle
  • 在 openSUSE 上安装最新的 Python

    我使用 Zypper 包管理器在 openSUSE 系统 参见下面的版本 上安装了 Python 这为我提供了 Python 3 2 但某些包需要 Python 3 3 更新为zypper update python3保留在 Python
  • Loaddata 未正确处理时间戳和时区

    我正在使用 django 1 4 1 并启用了 mysql 和时区 我将数据转储到 yaml 修改了一些字段以创建一些测试数据 并尝试将其重新加载 但是 即使指定了 tz Django 仍不断抱怨天真的日期时间 具体来说 我的负载数据有 f
  • 按频率对 SQL 查询记录进行排序

    有什么方法可以根据某个值在列中出现的频率来对从 SQL 查询中选择的记录进行排序吗 例如 如果有 5 个列 value1 的记录 3 个列 value2 的记录 以及 2 个列 value3 的记录 有没有办法让结果先显示 value1 然
  • mysql 仅替换某些字段

    我有一个 mysql 表 CREATE TABLE gfs localidad varchar 20 fecha datetime pp float 8 4 NOT NULL default 0 0000 temp float 8 4 NO
  • 获取特定区域的节点列表?

    我正在开发一款横向游戏 我需要知道某个区域中有哪些节点来实现 视线 之类的功能 现在我正在尝试使用 enumerateBodyiesInRect 但它检测到的主体距离评估的矩形 20px 或更多 我无法弄清楚为什么它如此不精确 这就是我现在
  • 如何在 php 中获取远程域的 HTTP 状态代码?

    我想创建一个批处理脚本 遍历数据库中的 20 000 个链接 并清除所有 404 等 如何获取远程 URL 的 HTTP 状态代码 最好不要使用curl 因为我没有安装它 CURL 会是完美的 但由于你没有它 你将不得不开始使用套接字 该技
  • R 中复杂的非等值合并

    我正在尝试在两个表之间进行复杂的非等值连接 我受到了上次 userR 2016 中的演示的启发 https channel9 msdn com events useR international R User conference useR
  • JavaScript 循环性能 - 为什么将迭代器递减到 0 比递增迭代器更快

    在他的书中更快的网站Steve Sounders 写道 提高循环性能的一个简单方法是将迭代器向 0 递减 而不是向总长度递增 实际上这一章是由 Nicholas C Zakas 撰写的 此更改可以使原始执行时间节省高达 50 具体取决于每次
  • git 不添加现有文件夹

    最近开始做一个项目 然后决定把它推到github上 所以我做了以下事情 cd
  • Angular 6 中的倒计时器

    您好 我正在尝试获取一个倒计时器的示例 我在堆栈上搜索时找到了这里 角度 2 倒计时 这是我的代码 import Component ElementRef OnInit OnDestroy from angular core import
  • XSLT:转换为非 xml 内容?

    是否可以使用 XSLT 将 XML 转换为 XML 以外的内容 例如我想要决赛non xml内容
  • 为什么 Visual Studio 在自分配时不发出警告 (int foo = foo;)

    我正在重构一个出现了无数次的术语 不小心产生了如下代码所示的情况 include stdafx h include
  • 以编程方式切换 Bootstrap 3 导航栏

    我在 Bootstrap 3 导航栏中使用了一些项目 如下所示
  • Autofac复合图案

    我注意到我经常需要实现复合模式 例如 interface IService class Service1 IService class Service2 IService class CompositeService IService pu