Autofac - 如何创建带有参数的生成工厂

2023-12-28

我正在尝试使用 Autofac 创建一个“生成”工厂,它将根据枚举参数实时解决依赖关系。

给定以下接口/类:

public delegate IConnection ConnectionFactory(ConnectionType connectionType);

public enum ConnectionType
{
    Telnet,
    Ssh
}

public interface IConnection
{
    bool Open();
}

public class SshConnection : ConnectionBase, IConnection
{
    public bool Open()
    {
        return false;
    }
}

public class TelnetConnection : ConnectionBase, IConnection
{
    public bool Open()
    {
        return true;
    }
}

public interface IEngine
{
    string Process(ConnectionType connectionType);
}

public class Engine : IEngine
{
    private ConnectionFactory _connectionFactory;

    public Engine(ConnectionFactory connectionFactory)
    {
        _connectionFactory = connectionFactory;
    }

    public string Process(ConnectionType connectionType)
    {
        var connection = _connectionFactory(connectionType);

        return connection.Open().ToString();
    }
}

我想使用 Autofac 生成某种工厂,该工厂具有一种接收一个参数的方法:ConnectionType 并返回正确的连接对象。

我从以下注册开始:

builder.RegisterType<AutoFacConcepts.Engine.Engine>()
    .As<IEngine>()
    .InstancePerDependency();

builder.RegisterType<SshConnection>()
    .As<IConnection>();
builder.RegisterType<TelnetConnection>()
    .As<IConnection>();

然后我继续使用不同的选项来使用 TelnetConnection/SshConnection 注册:

  1. Named
  2. Keyed
  3. Metadata

我找不到允许我定义生成的工厂委托的正确注册组合,该委托将返回正确的连接对象(对于 ConnectionType.Ssh 为 SshConnection,对于 ConnectionType.Telnet 为 TelnetConnection)。


更新Engine上课Func<ConnectionType, IConnection>而不是代表。奥特法支持通过以下方式动态创建委托工厂Func<T> http://docs.autofac.org/en/latest/advanced/delegate-factories.html.

public class Engine : IEngine
{
    private Func<ConnectionType, IConnection> _connectionFactory;

    public Engine(Func<ConnectionType, IConnection> connectionFactory)
    {
        _connectionFactory = connectionFactory;
    }

    public string Process(ConnectionType connectionType)
    {
        var connection = _connectionFactory(connectionType);

        return connection.Open().ToString();
    }
}

在您的注册中,使用 lambda 来获取参数并返回正确的值IConnection实例。

builder.Register<IConnection>((c, p) =>
{
    var type = p.TypedAs<ConnectionType>();
    switch (type)
    {
        case ConnectionType.Ssh:
            return new SshConnection();
        case ConnectionType.Telnet:
            return new TelnetConnection();
        default:
            throw new ArgumentException("Invalid connection type");
    }
})
.As<IConnection>();

如果连接本身需要依赖项,您可以调用Resolve on the c参数从当前调用上下文解析它。例如,new SshConnection(c.Resolve<IDependency>()).

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

Autofac - 如何创建带有参数的生成工厂 的相关文章

  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 有没有办法设置 log4net 内存附加程序可以包含的最大错误消息数?

    我想向根记录器添加一个内存附加程序 以便我可以连接到应用程序并获取最后 10 个事件 我只想保留最后 10 个 我担心这个附加程序会消耗太多内存 该应用程序设计为 24 7 运行 或者还有别的办法吗 您需要创建一个自定义附加程序来存储有限数
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • 为什么 Firebase 在 once() 函数之外会丢失引用?

    我使用 Firebase 和 angularJS 来获取用户列表 我可以使用以下命令从数据库中读取所有用户once 功能 但我不明白为什么userList下面返回未定义 service userService function this g
  • 有人可以推荐一个好的 C++ 数据包嗅探器类吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人可以推荐一个好的 C 数据包嗅探器类吗 寻找一个可以在我的 C 程序中使用的简单可插入类 没什么复
  • 如何从 Subversion 存储库编辑和提交单个文件?

    使用TortoiseSVN 命令行解决方案也可以 无需在存储库端创建文件夹 签出单个文件 编辑并使用注释签入的步骤是什么 AFAIK 您无法从 SVN 获取单个文件的副本 工作副本始终是一个目录 因此 您需要签出整个文件夹才能编辑有问题的文
  • 编程风格:应该检查函数内或函数外的 null 吗?

    当您使用对象调用函数时 是否应该在调用函数之前检查函数中是否为空 或者两者都检查 什么是更好的编程实践 像这样的东西 Test a getTest if a null myFunc a def myFunc x print x val or
  • 如果路径以“/api”开头并且有一个映射为后备的文件,如何返回 404?

    我有一个 ASP NET Core 6 0 应用程序 WeatherForecastController index html in wwwroot folder 我已经配置了index html作为文件后备 这是main的方法progra
  • 没有省略值的分组非密集排名

    我有以下数据框 df lt data frame date c 1 1 1 1 2 2 2 2 3 3 3 3 id c 4 4 2 4 1 2 3 1 2 2 1 1 我想添加一个新列grp它对每个日期的 ID 进行排名 关系应具有相同的
  • 数据库查询和插入速度取决于什么?

    在我的工作中 我们有一个小型数据库 有 200 个表 总共可能有 100 万行左右 我一直期望它的速度相当快 每秒插入数万次 并且一旦建立连接 查询只需几毫秒 恰恰相反 我们遇到了一些性能问题 因此我们每秒只能进行几百次插入和查询 即使是最
  • Rails 3 + Carrierwave + nginx = 权限被拒绝

    我已经用 rmagick 安装了 Carrierwave gem 如果通过 WEBrick 加载 我可以让它正常工作 但在尝试使用 nginx 时会出现 500 内部服务器错误 nginx error log 说 2011 08 14 10
  • Jetpack 将数字输入到文本字段

    当键盘的 KeyboardType 设置为 KeyboardType Number 时 我当前无法捕获用户输入到文本字段中 如果键盘设置为 KeyboardType Text 则文本字段会按预期更新 但是当设置为 KeyboardType
  • Heroku 无法在 Visual Studio Code 中加载

    heroku File C Users mar AppData Roaming npm heroku ps1 cannot be loaded The file C Users mar AppData Roaming npm heroku
  • 熟悉 SilverStripe 吗?您的意见/印象是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Firebase 部署显示没有应用内容的欢迎屏幕

    我克隆了一个快速启动角度应用程序 我跑firebase init and firebase deploy 输出显示部署成功 我导航到url https scratch app 8fde2 firebaseapp com 但它只显示欢迎屏幕
  • 初始化对象的编码模式 - 构造函数(新)与 Object.create() (Crockford)

    注意 这不是一个关于经典继承和原型继承的问题 这是关于使用什么编码模式来初始化对象 类构造函数创建并初始化对象 同时避免new运营商并走向Object create 仅创建对象并设置原型链 我还没有找到一个在线资源来解释在使用 Crockf
  • 为什么反应钩子形式输入中的第一个字母是死的

    我需要帮助来理解为什么简单输入组件中的第一个字母没有注册 我从示例中创建了一个简单的受控输入 但它无法正常工作 我为你创建了一个例子https stackblitz com edit react 9zezqx https stackblit
  • CMake:将 ELF 嵌入可执行文件

    我有一个项目需要访问嵌入到可执行文件中的 ELF 文件特别部分 https stackoverflow com questions 2627004 embedding binary blobs using gcc mingw 我之前手工制作
  • 交易ID设置正确,但稍后仅显示提交

    我的代码给出了正确的响应并正确设置了交易 ID 但是在屏幕上 我第一次提交时缺少ID 当我返回并再次提交时 屏幕上的ID就是第一笔交易的ID On the 首先提交 这被渲染为 MOBILE NUMBER 9129992929 OPERAT
  • 如何在 Hibernate 中限制数据库级别的用户访问

    The App 我需要实现一个可供不同用户使用的网络应用程序 每个用户对不同的表有不同的权限 例如 用户 A 可以看到表中的 名称 和 地址 字段Student 用户 B 可以看到表中的 姓名 和 电话号码 字段 但看不到 地址 Stude
  • 如何从 Python 中的元组中获取整数?

    我有一个包含两个数字的元组 我需要获取这两个数字 第一个数字是 x 坐标 第二个数字是 y 坐标 我的伪代码是我关于如何去做的想法 但是我不太确定如何让它工作 伪代码 tuple 46 153 string str tuple ss str
  • 使用 sass 连接字符串

    我想写一个像这样的 sass 循环 fractions for i from 1 through 4 fractions fractions 1fr grid i grid template columns fractions displa
  • Autofac - 如何创建带有参数的生成工厂

    我正在尝试使用 Autofac 创建一个 生成 工厂 它将根据枚举参数实时解决依赖关系 给定以下接口 类 public delegate IConnection ConnectionFactory ConnectionType connec