ASP.NET Core - 使用 [FromServices] 属性可能会出现哪些挑战或问题? [关闭]

2024-03-01

我在 ASP Core MVC 中有一个控制器。我正在尝试减少构造函数中的依赖注入服务,以便我可以更轻松地开始构建单元测试。但是,我注入了一些仅在一个或两个控制器操作中使用的服务。例如我注入ILocationService因为在我的一些操作中,我需要查找一个国家/地区Id号并使用数据库获取 ISO Alpha-2 国家/地区代码(例如,将 ID 号 1 映射到“CA”,将 2 映射到“US”等)

Asp Core 支持[FromServices]属性,所以我可以选择注入ILocationService直接进入我的两个操作,而不是将它们注入控制器构造函数中。这样做的好处是我不需要总是模拟/注入ILocationService从每个单元测试进入我的控制器,并且在编写每个功能所依赖的服务的单元测试时更加清楚。

明显的缺点是现在它并不完全明显和清楚我的控制器所依赖的服务,因为它们没有全部分组在构造函数中。

使用该工具可能会出现任何其他具体挑战、问题或困惑点吗?[FromServices]属性?


这种类型有一些不幸的缺点方法注入 https://freecontent.manning.com/understanding-method-injection/您应该考虑:

  • Such [FromServices]属性很容易被忘记,并且您只会在调用操作时找到(而不是在应用程序启动时找到 - 或在单元测试期间 - 您可以在其中验证应用程序的配置)
  • 搬家的必要性构造函数注入 https://freecontent.manning.com/understanding-constructor-injection/出于性能原因,这表明注入的组件太重而无法创建,而注入构造函数应该很简单 https://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/,因此,组件创建应该非常轻量级。
  • 需要远离构造函数注入以防止构造函数变得太大,这表明您的类有太多依赖项并且变得太复杂。换句话说,具有许多依赖关系表明该类违反了单一责任原则 https://en.wikipedia.org/wiki/Single_responsibility_principle。您的控制器操作可以轻松地划分为不同的类,这一事实证明此类控制器的内聚性不是很强,因此表明存在 SRP 违规。

因此,我建议不要使用方法注入来隐藏根本问题,而是使用构造函数注入作为唯一的注入模式,并使控制器更小。然而,这可能意味着您的路由方案与您的类结构不同,但这完全没问题,并且完全受 ASP.NET Core 支持。

顺便说一句,从可测试性的角度来看,如果有时存在不需要的依赖项,那并不重要。有有效的测试模式 https://stackoverflow.com/a/32595171/264697解决这个问题。

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

ASP.NET Core - 使用 [FromServices] 属性可能会出现哪些挑战或问题? [关闭] 的相关文章

  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span

随机推荐