依赖注入带来的性能问题

2024-01-16

在我的探查器报告中,我越来越多地看到使用依赖项注入进行基于模拟的测试的结果。许多依赖项是静态的,但因为我们想要单独测试方法,所以它们被更改为实例成员,如下例所示:

class ShortLivedThing {
   IDependency1 dep1;
   IDependency1 dep2;
   IDependency1 dep3;
   ...

   int TheRealData;

   // Constructor used in production 
   public ShortLivedThing() {
     dep1 = new Dep1(); dep2 = new Dep2(); dep3 = new Dep3();
   }

   // DI for testing 
   public ShortLivedThing(IDependency1 d1, IDependency2 d2, IDependency3 d3) { 
     dep1 = d1(); dep2 = d2(); dep3 = d3();
   }
}

反过来,大多数时候,依赖关系还有其他依赖关系,依此类推。这导致实例化一棵(大部分是“静态”)对象树每次方法调用是在测试之外完成的。每个对象都非常小(只有几个指针),但树效应将其转化为不断增加的性能损失。

我们对于它可以做些什么呢?


在我看来,您需要利用适当的依赖注入框架可以提供的功能。不要使用不同的构造逻辑进行测试/生产。

使用 Spring,单例注入仅在容器启动时执行。每次都会进行原型注射。每次运行单元测试时也会完成完整的接线(如果已接线)。因此分析单元测试通常不是一个好主意。

也许您使用的单例作用域太少而原型作用域太多? (原型=每次都有新实例)

spring 注入的好处是您可以使用作用域代理,这意味着您的对象图可以如下所示:

 A Singleton
 |
 B Singleton
 |
 C Prototype (per-invocation)
 |
 D Singleton
 |
 E Session scope (web app)
 |
 F Singleton

每个请求在每个会话中只会创建 1 个 C 实例和 1 个 E 实例。 A、B、D 和 F 是单例。如果它不是 Web 应用程序,则默认情况下没有会话作用域,但您也可以创建自定义作用域(“窗口”作用域对于窗口桌面应用程序来说听起来很酷)。这里的线索是,您可以在任何级别“引入”作用域,实际上您可以拥有十层单例对象,并且突然出现一些会话作用域的内容。 (这确实可以彻底改变您在分层架构中实现一些横切功能的方式,但这是一个不同的故事)

我认为,这确实在 DI 模型中提供了尽可能少的对象创建。

虽然这是 Spring for Java,但我相信许多其他 DI 框架应该支持类似的功能。也许不是最简约的。

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

依赖注入带来的性能问题 的相关文章

  • 使用 ASP.New MVC 4 Web Api 进行授权过滤器依赖注入

    我正在尝试在 MVC 4 Web Api 授权过滤器上实现依赖项注入 我创建了一个继承自 ActionDescriptorFilterProvider 的 FilterProvider public class UnityWebApiFil
  • Dagger 2:无法解析匕首组件的符号

    我想锻炼这个Dagger 2 车载电机 http code tutsplus com tutorials dependency injection with dagger 2 on android cms 23345例子 除了我的 Grad
  • 使用 TinyIoC 进行构造函数注入

    我刚刚从 Ninject 更改为 TinyIoC 进行依赖项注入 但在构造函数注入方面遇到了问题 我已设法将其简化为以下片段 public interface IBar public class Foo public Foo IBar ba
  • 工厂中的依赖注入

    我对 DI 很陌生 但我真的很想尝试使用它 有件事我不明白 这是一个简单的工厂伪代码 我经常使用 class PageFactory public function construct dependency list save refere
  • Unity 3 按约定配置未在 Web 项目中找到类型

    我正在尝试使此约定配置正常工作 但我的 ASP NET MVC5 项目遇到问题 我在 Application Start 方法中添加了以下内容并将其连接到 DependencyResolver public static IUnityCon
  • 使用选项模式的依赖注入

    我正在尝试从 appsettings 文件加载一些设置 但在使用选项模式时加载列表的方式遇到了一个小问题 假设我有以下类 用于加载设置 public class Application public string Name get set
  • 类型 RoleStore 不可分配给服务 IRoleStore

    我正在尝试使用 Autofac 为使用 MVC5 和 EF6 的项目设置依赖项注入 我很难弄清楚如何正确解耦 EntityFramework RoleStore 实现 我只想依赖 Identity IRoleStore 但我知道对于泛型类
  • 使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

    我在我的 xamarin 表单项目中使用 Prism 我能够在我的视图模型中使用依赖注入 构造函数注入 没有任何问题 我还利用后台服务在后台推送长时间运行的任务 如何做我在后台服务中注入依赖项 当我尝试将接口对象作为参数传递给构造函数 Sy
  • 如何在控制器外部访问RequestContext?

    背景 我正在尝试将业务逻辑从控制器移至它们自己的服务中 控制器 public class AccountController Controller private readonly IAccountService accountServic
  • 在 Fragment 和 Activity 之外通过 Hilt 进行现场注入

    我想知道是否可以在片段或活动之外使用字段注入 我知道我可以使用构造函数注入 但是我想知道是否也可以使用字段注入 我认为 Dagger 是可能的 当我尝试用注入的东西做某事时yclass字段我收到此错误 lateinit property y
  • 具有通用存储库、依赖项注入和 SoC 的 EF6 Code First

    经过大量阅读和尝试之后Entity Framework最新稳定版本 6 1 1 我读到了很多关于是否使用存储库的矛盾EF6 or EF一般来说 因为它是DbContext已经提供了一个存储库并且DbSet the UoW 盒子外面 让我首先
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • “@inject”-ed 属性保持为空

    我试图将服务注入到我的 bean 中 但它总是null 我收到以下错误 WELD 001000 根据基本 null 解析属性 userBean 时出错 一些代码片段 索引 xhtml
  • Windows 8 Metro 应用程序的依赖注入框架

    我似乎找不到 Windows 8 Metro 应用程序的依赖注入框架 win8 Metro应用程序有框架吗 Ninject 尚不支持 win8 Metro 那么有人有建议吗 城堡 春天 你可以尝试Unity 3 0 for NET4 5 预
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 依赖注入的惰性解析

    我有 net 课程 我使用 Unity 作为 IOC 来解决我们的依赖关系 它尝试在开始时加载所有依赖项 Unity中有没有一种方法 设置 允许在运行时加载依赖项 还有更好的解决方案 Unity 2 0 中对 Lazy 和 IEnumera
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 如何将窗口注入到服务中?

    我正在用 TypeScript 编写一个 Angular 2 服务 它将利用localstorage 我想注入对浏览器的引用window对象到我的服务中 因为我不想引用任何全局变量 例如 Angular 1 x window 我怎么做 这目
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法

随机推荐

  • 替换 javascript 中的 JSON 键

    假设我有一个 JSON 对象 例如 var myjson com mycompany top Element com mycompany top count 10 com mycompany top size 0 我想用冒号替换键中的点 句
  • F3 更改 css 文件的相对 URi

    我是一个尝试 F3 的新手 我的示例应用程序基本上可以工作 但是对 css 文件的引用发生了更改并导致找不到 它看起来像 htaccess 问题 但我似乎无法修复它 我的 css 文件指定为 我的 htaccess 文件看起来像 Rewri
  • 为什么 UITextView 在调整大小后会在错误的框架中绘制文本?

    我陷入了某种魔力 当我尝试更改 UITextView 框架 在本例中使用 UISlider 时 文本会在比框架更小的其他区域中绘制 多次调整大小 有趣的是 如果我们在尝试使框架变大时滑动得足够快 文本就会绘制在非常正确的区域中 有人可以解释
  • 动态大小类型总是在堆上吗?

    我对 Rust 的学习让我了解了动态大小类型 DST 并且我知道这些类型的大小在编译时无法得知 例如 str 我现在的问题是 我说 DST 永远不能存在于堆栈上 它们只存在于堆上 这样说对吗 另外 另一方面 说大小类型可以存在于堆栈中是否正
  • GridView 排序仅有效一次

    我有一个网格 它仅按升序排序一次 然后什么也没有发生 aspx文件代码
  • 如何在 Swift 4 中创建一定大小的数组?

    如何制作一个包含 1000 个浮点数的简单数组 我已经尝试过这个 var computeArray Array
  • 如何从node.js缓冲区获取int

    是代码 var time new Buffer 506BF1E3 hex time toString Pk 0x506BF1E3 1349251555 UNIX时间 如何获取 1349251555 表格time缓冲 这个也能达到目的 通过使
  • SQL Server:过滤 sp_who2 的输出

    在SQL Server下 有没有一种简单的方法来过滤sp who2的输出 例如 假设我只想显示某个数据库的行 你可以尝试类似的东西 DECLARE Table TABLE SPID INT Status VARCHAR MAX LOGIN
  • 如何检查使用哪个编译器来构建Python

    有没有办法知道使用哪个编译器来构建Python安装在特定的linux机器上 我尝试使用ldd on the Python动态库 1 但我无法理解它是否是用gcc或英特尔编译器 1 ldd libpython2 7 so 1 0 linux
  • Clang 在 c++98 模式下使用 std::stoi 编译代码

    我需要用 C 98 编译我的 cpp 而不是我的学校项目的 C 11 所以我用了 std c 98编译 CPPFLAGS Wall Werror Wextra std c 98 但我犯了一个错误并使用了C 11std stoi功能 i st
  • 如何让浮动div居中?

    我想将下面模型中出现的三个 div 居中 全部都有 float left 这可能吗 我不介意有包装器div Text align center 和 display inline block 不适用于我的代码 如果你想让它们居中 你就不能浮动
  • 发布时母版页出现“无法加载类型”错误

    本地查找一切正常 但是当我将 ASP NET 应用程序发布到远程服务器时 出现以下错误 Server Error in Application Parser Error Description An error occurred durin
  • 页面加载时的 JSF 重定向

    简短的问题 是否可以进行重定向 例如当用户未登录时 当呈现页面时 为此你should http java sun com products servlet Filters html use a Filter http java sun co
  • 如何用颜色突出显示浏览器选项卡

    我有一个聊天 Web 应用程序 我需要一项功能 其中如果特定用户在浏览器窗口中打开了多个选项卡 并且聊天选项卡不是活动选项卡 那么如果他从另一端收到 ping 则聊天选项卡应该自动突出显示以吸引用户注意力 我打算用 jQuery 来做这件事
  • 高调的 MonoTouch 应用程序? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想要一些使用 MonoTouch 创建的高调应用程序的示例 您打电话回家的应用程序 进入所属类别前 25 名的应用程序 我在哪里可以找到此类应用程序
  • 如何在 Debian postinst 脚本中获取新安装的版本?

    Per the Debian 政策手册 http www debian org doc debian policy ch maintainerscripts html 我的 postinst 脚本在升级和配置时被调用 如 postinst
  • Hibernate Validator - 添加动态 ConstraintValidator

    了解后Hibernate 自定义验证器 https docs jboss org hibernate validator 4 0 1 reference en html validator customconstraints html 它让
  • 无法使用 GAE/J DataNucleus 插件版本 2.1.2 获取新创建的 JDO 持久实体的 ID

    我的问题 我正在使用新的 1 7 5 GAE J SDK 将我的应用程序从 GAE J 的 DataNucleus 插件版本 1 x 移植到 2 0 这将我的 JDO 版本从 2 3 更改为 3 0 1 我的持久实体类有一个编码字符串类型的
  • Javascript - 将 INI 文件解析为嵌套关联数组

    我是 Javascript 新手 在将 INI 格式的文件解析为嵌套对象时遇到问题 我的文件格式如下 ford car focus transmission standard ford car focus engine four cylin
  • 依赖注入带来的性能问题

    在我的探查器报告中 我越来越多地看到使用依赖项注入进行基于模拟的测试的结果 许多依赖项是静态的 但因为我们想要单独测试方法 所以它们被更改为实例成员 如下例所示 class ShortLivedThing IDependency1 dep1