依赖注入和单例设计模式

2023-11-27

我们如何确定何时使用依赖注入或单例模式。 我在很多网站上读过,他们说“使用依赖注入而不是单例模式”。但我不确定我是否完全同意他们的观点。对于我的中小型项目,我肯定会直接使用单例模式。

例如记录器。我可以用Logger.GetInstance().Log(...)但是,为什么我需要用记录器的实例注入我创建的每个类,而不是这个?


单例就像共产主义:它们在纸面上听起来都很棒,但在实践中却会出现问题。

单例模式过分强调访问对象的便捷性。它完全避开了上下文,要求每个使用者都使用 AppDomain 范围内的对象,不为不同的实现留下任何选项。它将基础设施知识嵌入到您的课程中(调用GetInstance())同时精确添加zero表达力。它实际上削弱了你的表达能力,因为你不能改变一个类使用的实现而不改变它all其中。您根本无法添加一次性的功能。

还有上课的时候Foo依赖于取决于Logger.GetInstance(), Foo有效地向消费者隐藏其依赖性。这意味着你不能完全理解Foo或者放心地使用它,除非您阅读了它的来源并发现它取决于的事实Logger。如果您没有源代码,就会限制您理解和有效使用您所依赖的代码的程度。

使用静态属性/方法实现的单例模式只不过是围绕实现基础设施的一种 hack。它以多种方式限制您,同时与其他选择相比没有提供明显的好处。您可以随心所欲地使用它,但由于有可行的替代方案可以促进更好的设计,因此永远不应该推荐它。

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

依赖注入和单例设计模式 的相关文章

  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • Dagger2 - 项目重建错误 - 字段注入 - Android

    我一直在尝试实现 Dagger2 Problem 当我使用构造函数注入时 它工作正常 但是当我使用字段注入时 它会抛出如下错误 Error 6 48 error cannot find symbol class DaggerApplicat
  • 通过 .NET Core 控制台应用程序中的依赖项注入访问配置

    如何正确激活使用 ServiceCollection Configure 函数添加的配置 public static void Main args args serviceCollection new ServiceCollection s
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 一个类应该验证自身还是创建另一个类来验证它?

    假设我有一堂课 class NavigationData float roll float pitch double latitude double longitude 如果我想创建一个方法 const bool validate cons
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • 静态库中的单例类

    假设我在静态库中有一个单例类 S 它可以与其他动态库 D1 D2 D3 链接 因此 据我了解 类 S 在每个 D1 D2 和 D3 中都会有一个单独的实例 即使它不是单例 如全局 这也是正确的 有什么办法可以防止S类的多副本吗 我无法将单例
  • IoC 服务的抽象类还是接口?

    我目前正在使用 IoC 在项目中提供存储库的具体实现 我读过的所有示例都使用接口作为服务的定义 但是 在阅读了 Microsoft 的建议后 建议更喜欢抽象类而不是接口 http msdn microsoft com en us libra
  • 依赖注入错误:在注册类时尝试激活时无法解析类型的服务

    我创建了一个 NET Core MVC 应用程序 并使用依赖注入和存储库模式将存储库注入到我的控制器中 但是 我收到错误 InvalidOperationException 尝试激活 WebApplication1 Controllers
  • 如何将窗口注入到服务中?

    我正在用 TypeScript 编写一个 Angular 2 服务 它将利用localstorage 我想注入对浏览器的引用window对象到我的服务中 因为我不想引用任何全局变量 例如 Angular 1 x window 我怎么做 这目
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 什么是对象序列化和反序列化?

    什么是对象序列化 and 反序列化 序列化与读取对象的属性 然后用它们填充 DataRow 的列 最后将 DataRow 保存在数据库中等普通技术有什么区别 序列化通常是指创建可用于存储 可能在文件中 通过网络传输或仅用于进程之间传输的数据
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas

随机推荐

  • 与给定表或视图有关系的所有表的列表

    在 SQL Server 中 是否有命令返回与给定表或视图有关系的所有表的列表 编辑 SQL Server 2008 对于 SQL Server 2005 及更高版本 请使用以下内容 SELECT name OBJECT NAME pare
  • Java 8 相当于 Streams 的 getLineNumber()

    Java 8 中的 Streams 是否有与 getLineNumber 等效的方法 我想在文本文件中搜索单词并将行号作为整数返回 这是我的搜索方法 result Files lines Paths get fileName filter
  • 澄清 Ingress 负载均衡器

    我不确定负载平衡如何与 Ingress 配合使用 如果我理解正确的话 发生的事情实际上是这样的 我看不到负载平衡是如何执行的 我上面画的方案有什么问题吗 你能帮我纠正一下吗 Notes 以下答案告诉我入口控制器本身是 负载均衡器 类型 入口
  • 3 种颜色之间的颜色插值

    我使用以下方程获得从 colorA 到 colorB 的漂亮颜色渐变 但我不知道如何对 3 种颜色执行相同的操作 因此渐变从 colorA 到 colorB 到 colorC colorT colorA p colorB 1 0 p 其中
  • 将自定义标识符分配给 @id 属性

    我正在将遗留系统迁移到使用 Hibernate 3 它当前生成自己的标识符 为了在尝试将系统转移到更好的系统之前保持系统当前的功能 我将如何指定 使用注释 我自己的类 该类将在发生插入时返回自定义生成的标识符 就像是 Id CustomId
  • 防止sequelize在node.js应用程序中删除数据库

    首先 我使用带有sequelize ORM 和Postgresql 的node js 我有两个简单的问题 每次我重新运行节点应用程序时 sequelize 都会删除并创建数据库中的所有表 如何防止它这样做 我不想删除数据库中的记录 我尝试设
  • 如何使用 jQuery 找到“ul”中的最后一个“li”?

    我想检查li这是最后一个li in ul 我如何使用 jQuery 检查这一点 ul li value class selected 1 li li value 2 li li value 3 li li value 4 li li val
  • 如何在整个应用程序中显示底部的迷你控制器或持久媒体控件(例如 Spotify 或 Google 音乐)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在开发一个应用程序 可以播放来自 youtube 或其他实时流媒体的视频 如果用户按下后退 主页按钮 用户只能听到音频 然后他们可以返回再次观看视频 我创建了一个可以容纳玩家
  • 如何对 Scala 数组的每一列求和?

    如果我在 Scala 中有一个数组的数组 类似于矩阵 那么对矩阵的每一列求和的有效方法是什么 例如 如果我的数组数组如下所示 val arr Array Array 1 100 Array 2 200 Array 3 300 我想对每一列求
  • 计算文件复制的剩余时间

    我有一个应用程序 可以通过网络将大量文件复制到文件服务器 不是网络 我试图显示对剩余时间的一半不错的估计 我看过很多关于SO的文章 但问题没有得到解决 但我没有尝试真正做我想做的事情 我希望估计的剩余时间相对稳定 即不会根据波动的传输速度到
  • 从字符串中删除引号

    所以我认为这只是一个简单的问题 但我得到了不正确的结果 基本上我试图删除字符串周围的引号 例如 我有字符串 01 00 我想要 01 00 下面是我认为如何能够做到这一点的代码 expected start time conditions
  • WM_COMMAND 在 C++ win32 中捕获按钮按下

    我正在尝试使用 c win32 获取按钮按下事件WM Command HWND hBtn HWND hBtnParent HWND UploadVideo HWND SelectVideoBTN UploadBTN HWND hWnd HI
  • 将 Interface Builder 中创建的 UITabBarController 设置为委托

    我使用选项卡栏模板创建了 iOS 应用程序 因此这里是带有栏按钮的 UITabBarController 一个问题是如何将其设置为委托 我发现它必须在 AppDelegate 中以编程方式设置 但我相信这是不可能的 因为我无法访问选项卡栏控
  • Python:从数字列表中删除负数

    问题是从数字中删除负数 When remove negs 1 2 3 3 6 1 3 1 执行后 结果为 1 2 3 6 3 1 结果应该是 1 2 3 6 3 1 发生的情况是 如果连续有两个负数 例如 1 3 那么第二个数字将不会被删除
  • 如何以编程方式更改 C# 中的程序集名称

    我想在 C 中以编程方式更改程序集的名称 有一种方法可以从项目属性中更改它 但我想以编程方式更改它 以便更改我的输出 exe 名称 任何技巧 您可以在构建后事件中执行此操作 这些脚本是在构建过程完成后执行的命令行脚本 ren TargetF
  • 如何对对象的属性值求和?

    我想对以下属性值进行求和PieData 我的预期输出是25515512 916952499 942468011 var PieData value 25515512 color 00a65a highlight 00a65a label R
  • HTML/CSS:使 div 对点击“不可见”?

    由于各种原因 我需要放置一个 大部分 透明的 div 在一些文字上 但是 这意味着无法单击文本 例如 单击链接或选择它 是否可以简单地使该 div 对于单击和其他鼠标事件 不可见 例如 overlaydiv 覆盖了文本 但我希望能够通过单击
  • 剃刀视图 » 字符呈现为 »

    字符似乎在剃刀视图中渲染为 我努力了 and Html Raw 但问题并没有消失 我对 ASPX 视图没有这个问题 另外 文化被设定为
  • Python-docx - 如何更改表格字体大小?

    table document add table rows 1 cols 1 hdr cells table rows 0 cells hdr cells 0 text Qty 我必须更改一行一列表格中文本 数量 的字体大小 我该怎么做 您
  • 依赖注入和单例设计模式

    我们如何确定何时使用依赖注入或单例模式 我在很多网站上读过 他们说 使用依赖注入而不是单例模式 但我不确定我是否完全同意他们的观点 对于我的中小型项目 我肯定会直接使用单例模式 例如记录器 我可以用Logger GetInstance Lo