用户输入依赖注入的最佳策略是什么?

2023-12-20

我已经使用了大量的依赖注入,但我想获得有关如何在运行时处理来自用户的信息的输入。

我有一个连接到 com 端口的类。我允许用户选择 com 端口号。现在,我将该 com 端口参数作为构造函数参数。原因是如果没有这些信息,该类就无法运行,并且它是特定于实现的(该类的模拟版本不需要 com 端口)。

另一种方法是使用一个接受 com 端口的“Start”方法,或者使用一个设置 com 端口的属性。这使得它与 IoC 容器非常兼容,但从类的角度来看它不一定有意义。

看起来逻辑路线与依赖注入设计相冲突,但这是因为我的 UI 正在获取特定类型的类的信息。

其他替代方案包括使用 IoC 容器,它允许我传递额外的构造函数参数,或者仅在顶层构造我需要的类,而不使用依赖注入。

对于此类问题是否有普遍接受的标准模式?


您可以选择两条路线,具体取决于您的需要。

1. 将 UI 直接连接到具体类

这是最简单的选择,但很多时候是完全可以接受的。虽然您可能有一个包含大量接口并使用 DI 的域模型,但 UI 构成了对象图的组合根,您可以简单地在此处连接您的具体类,包括所需的端口号参数。

优点是这种方法简单且易于理解和实施。

缺点是灵活性较差。您将无法任意将一种实现替换为另一种实现(但话又说回来,您可能不需要这种灵活性)。

即使 UI 锁定到具体实现,这并不意味着领域模型本身不能在以下环境中重用:其他应用.

2.添加抽象工厂

另一种选择是添加另一层间接层。它可以使用抽象工厂来创建实例,而不是让 UI 直接创建类。

工厂的Create方法可以将端口号作为输入,因此这种抽象最适合 UI 子层。

public abstract class MyFactory
{
    public abstract IMyInterface Create(int portNumber);
}

然后,您可以让您的 DI 容器连接该工厂的实现,该工厂使用端口号并将其作为构造函数参数传递给您的实际实现。其他工厂实现可能会简单地忽略该参数。

这种方法的优点是您不会污染您的 API(或您的具体实现),并且您仍然拥有接口编程所提供的灵活性。

缺点是它增加了另一层间接性。

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

用户输入依赖注入的最佳策略是什么? 的相关文章

  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • 在 ASP.NET Core 的中间件中注入服务

    我想根据 HTTP 标头值注入服务 所以我有 2 个类 DbDataProvider 和 InMemDataProvider 它们都是从 IDataProvider 实现的 每当进行 API 调用时 客户端都会传递一个标头 该标头确定是需要
  • 如何在@FacesConverter中注入@EJB、@PersistenceContext、@Inject、@Autowired等?

    我怎样才能注入像这样的依赖项 EJB PersistenceContext Inject AutoWired等在一个 FacesConverter 在我的具体情况下 我需要通过注入 EJB EJB FacesConverter public
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • 提供通用服务接口最具体实现的依赖注入机制

    我觉得我和标题一起玩了流行语宾果游戏 这是我所要求的一个简洁示例 假设我有一些实体的继承层次结构 class BaseEntity class ChildAEntity BaseEntity class GrandChildAEntity
  • 静态方法中的统一

    一个可能很简单的问题 但很奇怪为什么我不知道该怎么做 Unity PRISM 和静态方法 在这种特殊情况下 需要使用扩展方法 但一般来说 如何在静态方法中访问 统一提供的实例 想想例如我想访问一个日志服务来记录我在静态方法中所做的一些事情
  • InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

    我开始将我的 asp net core RC1 项目转换为 RC2 并面临现在的问题IHttpContextAccessor没有解决 为了简单起见 我使用 Visual Studio 模板创建了新的 ASP NET RC2 项目ASP NE
  • 澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以我知道FixedUpdate应该用于物理操作等 但我很难理解什么算作物理 例如 我通过查看按下的键来移动角色 然后施加力 目前我正
  • 使用 Guice + Kotlin 绑定对象列表

    我正在 Kotlin 中使用以下控制器定义编写 JavaFX 应用程序 class MainController Inject private lateinit var componentDescriptors List
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • 何时使用依赖注入

    最近几天我有一种感觉 依赖注入真的应该被称为 我无法下定决心 模式 我知道这可能听起来很愚蠢 但实际上这是我应该使用依赖注入 DI 背后的原因 人们经常说我应该使用 DI 来实现更高级别的松耦合 我明白了 但实际上 一旦我选择了 MS SQ
  • 处理算法中的问题/错误的推荐方法

    将堆栈跟踪排除在外 可以说 错误 的想法是一个您不希望发生但确实发生的问题 如果我使用布尔系统来检查操作是否成功完成 它将如下所示 String array new String 10 int i 0 public boolean acce
  • 在爬行或使用 nutch 和 solr 建立索引期间从 html 中删除菜单

    我正在使用 nutch 爬行我们的大型网站 然后使用 solr 进行索引 结果非常好 然而 网站上有几个菜单结构会索引并破坏查询结果 每个菜单都在 DIV 中明确定义 因此 div div or div div 和其他几个 我需要在某个时候
  • IoC容器中创建的对象可以称为Singleton吗?如果不是——为什么?

    IOC容器中创建的对象可以称为Singleton吗 如果可以 为什么 如果不可以 为什么 谁能用简单的语言详细解释一下 IOC 容器如何准确管理对象 你可以说 Spring 单例不是单例 Singleton有其有意义的作用域 spring
  • Laravel 4:Facade 与 DI(何时使用)

    我的理解是 外观被用作依赖注入的替代方案 如果我错了 请纠正 目前尚不清楚的是何时应该使用其中之一 每种方法的优点 缺点是什么 我应该如何确定何时使用其中之一 最后 为什么不两者都使用呢 我可以创建一个引用接口的外观 貌似Sentry 2就
  • 如何用相同的方法“包装”两个类?

    我必须使用相同的方法处理两个类 但它们不实现相同的接口 也不扩展相同的超类 我无法 不允许更改此类 并且我不构造此类的实例 我只获取此类的对象 避免大量代码重复的最佳方法是什么 班级之一 package faa public class S
  • 依赖注入与程序集依赖

    假设我有以下项目结构 Application lt gt BusinessLogic lt gt DataAccessLayer 我已经准备好所有类型来使用穷人的依赖注入 现在我想介绍使用 Unity 的真正的依赖注入 但我正在努力寻找将依
  • asp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的同一实例

    我正在使用 MVC5 和普通 ADO NET 创建一个新项目 只是作为学习练习 我需要创建一个存储库 用于注册一个模型 其中包含几个也需要同时创建的相关对象以及这些对象反过来可能需要插入其他对象 我能想到的最简单的解决方案是拥有一个庞大的方
  • 如何在OOP中设计嵌套多态性?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon

随机推荐

  • selectOneMenu 的第二项加粗

    我有一个 selectOneMenu 其中包含一个州的所有城市 我已经创建了一个 sql 来将资本放在首位 但我想将其加粗以使其对使用它的人更明显 有没有办法将其加粗或采取其他措施以使第二个选项更加明显
  • 将 FindWindow 与多个根窗口一起使用

    所以我正在构建一个使用 win32 的 SendMessage 作为 IPC 的应用程序 我正在使用 FindWindow 根据 className 和 windowName 获取 hWnd 这一切都进展顺利 直到我想与一个与其他根窗口具有
  • 子域到端口重定向[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 5 天前 我创建了一个 AWS 实例来保存我的 jenkins 和 archiva 服务 我已经有自己的域 并创建了 DNS 子域jenk
  • XML FrameLayout 降低了我的 OpenGL SurfaceView 帧速率 (fps)

    我扩展了 GLSurfaceView 并实现了我自己的 GLSurfaceView Renderer 以创建我的第一个相对简单的 Android 2D OpenGLES 游戏 我一直在活动 onCreate 方法上使用以下代码来测试我的游戏
  • 我应该使用迭代器或描述符来保留边或顶点上的引用吗?

    我目前正在设计一个由 Boost Graph adjacency list 和引用此结构中的边或顶点的几个类组成的应用程序 我的问题是 维护对节点或顶点的引用的推荐方法是什么 我猜想在迭代器的情况下 对象访问速度更快 但迭代器可能会因图结构
  • F#,管道转发第一个参数

    与这个问题非常相似 F 管道第一个参数 https stackoverflow com questions 35716622 f pipe first parameter 我目前正在学习 F 和函数式编程 我想知道是否有一种简单的方法可以通
  • CollapsingToolbarLayout 仅在顶部时展开

    我对 AppBarLayout 和 CollapsingToolbarLayout 有一些问题 这是目前发生的情况 https www youtube com watch v z4yD8rmjSjU https www youtube co
  • 如何使用MySQL列别名进行计算?

    如何使用两个子查询中的列别名 lat 和 lng 来进行下面的距离计算 我基本上想做的是使用经度和纬度值计算两个位置之间的距离 但不知何故 我的别名在查询中无法使用 为什么 SELECT wp posts SELECT wp postmet
  • flutter中自定义路由事务错误

    我试图为屏幕实现自定义动画 但遇到错误 错误是 没有为类型 RouteSettings 定义 getter isInitialRoute 这是我的代码 class MyCustomRoute
  • 遍历层次结构对象c#

    如果我有一个像下面这样的课程 我如何遍历它直到它的属性 SomeObjects count 0 public class SomeObject public String Name get set public List
  • TSLint 摆脱缺失的空白

    我一直试图在互联网上搜索来解决这个问题 但没有成功 也许你可以帮助我 我收到 tslint 缺少空格 警告 内容如下 src app content content controller ts 中的警告 4 13 缺少空格 5 21 缺少空
  • 如何在Android Studio的CMakeLists.txt文件中设置版本脚本文件

    我在Android Studio中有一个ndk项目 我想通过这种方式控制导出的符号 set CMAKE SHARED LINKER FLAGS CMAKE SHARED LINKER FLAGS Wl version script D Pr
  • 使用移动网页检测 Android 应用程序是否已安装在设备上 - PHP 和 JS

    我有这样的要求 Android Pit 应用商店已经实现了类似的要求 我需要使用移动网页 PHP 和 JS 检查设备上是否已安装 Android 应用程序 如果安装则立即启动该应用程序 这些是Android坑使用的中间页面 当应用程序尚未安
  • tf.initialize_all_variables() 和 tf.global_variables_initializer() 之间有什么区别

    在Tensorflow官方网站上 它给出了解释tf initialize all variables and tf global variables initializer 功能如下 tf initialize all variables
  • 如何编写循环来重复代码?

    我是Python的初学者 我想重复这段代码 但我真的不知道如何在没有 goto 的情况下做到这一点 我试图了解循环 但不明白如何应用它们 import requests addr input vendor requests get http
  • 使用注释时如何声明 Spring bean autowire-candidate="false"?

    我在用 ComponentScan and Component定义我的春豆 我想要的是声明其中一个豆子是autowire candidate false 这可以通过 xml 中的此属性来完成 注释中没有等效的吗 我想要这个的原因是因为我有同
  • 服务参考的替代方案

    我正在尝试通过解决一些痛点来协助一个项目团队简化他们的工作 他们代码中的痛点之一是 他们通过服务引用 代理 使用 WCF 服务 即Visua Studio 2008 中的 添加服务引用 这会产生很多问题 包括部署开销 源控制获取更新代理的最
  • 带参数的泛型方法与带通配符的非泛型方法

    根据Java 泛型常见问题解答中的此条目 http www angelikalanger com GenericsFAQ FAQSections ProgrammingIdioms html FAQ302B 在某些情况下 泛型方法没有使用通
  • 在 bash 中按字典顺序比较两个包含 '_' 的字符串

    我需要按字典顺序比较 bash 脚本中的字符串 问题是 bash 似乎完全忽略了 字符 就好像它们根本不存在一样 在 ascii 代码表中 位于大写字母和小写字母之间 因此我假设 A Z 1 if ab lt a then echo 1 f
  • 用户输入依赖注入的最佳策略是什么?

    我已经使用了大量的依赖注入 但我想获得有关如何在运行时处理来自用户的信息的输入 我有一个连接到 com 端口的类 我允许用户选择 com 端口号 现在 我将该 com 端口参数作为构造函数参数 原因是如果没有这些信息 该类就无法运行 并且它