注入的依赖项应该是公开访问的还是私有的?

2023-12-20

是否应该将依赖项存储到具有私有 setter 和公共 getter 的私有字段或属性?这适用于构造函数 DI。

需要明确的是,在属性示例中,我不希望将它们添加到随附的接口中,除非有意义 - 即它们仅在实现类型中可见:

interface IFoo {
  void DoSomething();
}

class Foo : IFoo {
  private readonly IService dependency;
  public Foo(IService dependency) {
    this.dependency = dependency;
  }
}

class Bar : IFoo {
  public Foo(IService dependency) {
    this.Dependency = dependency;
  }

  public IService Dependency { get; private set; }
}

我总是会推荐private readonly字段,只要不需要从对象外部访问依赖项即可。将您的对象视为“黑匣子”,并尽可能少地在其公共接口中放置。这种做法更广为人知的是封装原理 http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) or 信息隐藏并且也适用于注入的依赖项:暴露的越少,类和类的用户之间的紧密耦合就越减少。

另一个应该提到的原则是对对象的行为进行建模:告诉,不要问。如果你需要完成某件事,请要求对象为你做。它将在此过程中使用其依赖项。请求属性并自己完成工作应该只是数据对象 (DTO) 的首选。

这也是首先使用构造函数注入的原因:如果将依赖项公开为属性是最佳实践,那么每个人都会进行属性注入,因为这意味着更少的代码(那么我们就不需要构造函数了)。

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

注入的依赖项应该是公开访问的还是私有的? 的相关文章

随机推荐

  • 模板智能感知

    我主要使用 C 而 VSCode 中缺少的一件事是 Angular 2 模板中的 IntelliSense 我发现这个问题有解决办法here https github com microsoft typescript issues 6508
  • 用于理解 OpenGL 中的视图、投影、“虚拟相机”或一般图形的资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我注意到大多数资源要么假设您已经了解很多 要么假设您了解专业水平的数学 要么假设您将找到其他资源来填补空
  • 如何从 Python 以隐身模式打开 chrome

    这在 powershell 中有效 Start Process chrome exe ArgumentList incognito www foo com 如何通过 Python 实现这一点 使用网络浏览器在 chrome 中打开隐身模式的
  • 在 jQuery mousedown 处理程序中添加覆盖层后,Internet Explorer 泄漏单击事件

    In a mousedowndiv 的事件处理程序创建另一个新 div 并将其附加到主体 这个新的div有position fixed 也可以是position absolute 并且具有 100 宽度和 100 高度 因此它立即覆盖触发鼠
  • 更新 Flutter 项目中的 Gradle

    我有这个项目Flutter 但由于 Gradle 版本的原因 我已经有几周无法构建 apk 了 我已经尝试了所有方法 但 Flutter 总是返回以下错误 我已经安装了我发现的每个更新 尽管它显示 Gradle 版本是 4 10 2 颤动构
  • 读取 Excel Open XML 会忽略空白单元格

    我正在使用此处接受的解决方案 https stackoverflow com questions 3321082 from excel to datatable in c with open xml将 Excel 工作表转换为数据表 如果我
  • 将主机名解析为 IP 地址

    我开发了一个客户端 服务器模拟应用程序 我在两台不同的 Windows XP 计算机上部署了客户端和服务器 不知何故 客户端无法向服务器发送请求 我尝试了以下选项 使用 IP 地址从客户端成功 Ping 通服务器计算机 使用 IP 地址成功
  • 访问者模式 - 添加新的 ConcreteElement 类很难吗?

    我读了一本关于访客模式的书 它给出了与中相同的类图oodesign 的网站 http www oodesign com visitor pattern html 它说添加新的 ConcreteElement 类很困难 但我不明白为什么 据我
  • CORS 请求 - 为什么未发送 cookie?

    我有一个跨域 AJAX GET 它已成功预检 但 cookie 未附加到 GET 请求 当用户单击登录按钮时 会发出 POST 来使用户登录 这可以在跨域中正常工作 JavaScript 是 ajax signin url type POS
  • Lucene.net 模糊短语搜索

    我自己已经尝试了相当长的一段时间 并在网络上到处寻找 但一直无法找到任何通过 Lucene NET 2 9 2 进行模糊短语搜索的示例 C 是否能够建议如何详细执行此操作和 或提供一些示例代码 我将非常感谢任何帮助 因为我完全陷入困境 我假
  • 检查 Swift 中两个字符串表达式之间的相似度

    我扫描了文字 Mils chiiese wh ite ch col te 和表达式列表 例如 cheese bread white chocolate etc 我需要将损坏的表达式与我的列表中的表达式进行比较 例如 白巧克力 和 wh it
  • 如何解析“Build:‘Promise’仅指一种类型,但在此处用作值。”

    在打字稿中 我收到构建错误 提示 Build Promise 仅指类型 但在此处用作值 我的项目目标是 ES5 从这个帖子中 我可以通过将其更改为 ES6 来解决该问题 有没有办法在不改变目标的情况下解决问题 typescript 错误 T
  • 从 Swagger 文档生成 Yaml 或 Json 文件

    我使用 swagger springmvc 注释开发了一些由 swagger 记录的 Rest Web 服务 现在 我想使用 swagger editor 生成客户端 Rest Web 服务代码 但 swagger editor 需要 Ya
  • Java ME 双空格中的字符串替换

    如何在 Java ME 中将 a b 替换为 a b The replace 方法不接受字符串 只接受字符 由于双空格包含两个字符 我想我有一个小问题 你觉得这个怎么样 我自己尝试过一个 private String replace Str
  • Windows 上 Python 的长路径

    我在 Windows 下运行 Python 编程时遇到问题 我需要使用长度超过 256 个或任何限制字符的文件路径 现在 我基本上阅读了两种解决方案 使用 kernel32 dll 中的 GetShortPathName 并以这种方式访问
  • C# ValueTuple 属性命名

    我正在尝试 C 中的 ValueTuple 类 我对属性命名有疑问 让我们看看 如果实例化一个 ValueTuple 并声明该对象 如下所示 var tuple1 Name Name1 Age 25 我们可以命名属性 但是 像这样 Valu
  • 将 .plist 文件与 iCloud 同步

    我正在尝试弄清楚如何同步 Mac 沙盒应用程序中 应用程序支持 文件夹中的 plist 文件 我知道我可以使用 iCloud 键值存储 但每个应用程序有 64KB 的限制 这可能会或可能不会达到 具体取决于用户向应用程序添加了多少内容 我已
  • Lucene排名-如何使用新的4.0评分模型

    我正拼命地尝试在 Lucene 中实现一项新功能 所以我向您求助 基本上 在此 JIRA ISSE 中 一些额外的评分模型已添加到 Lucene 中 https issues apache org jira browse LUCENE 29
  • MongoDB 聚合不同文档中数组中的项目数?

    这是我的 MongoDB 集合架构 company String model String tags String 我需要聚合它 以便得到以下输出 id company Lenovo model T400 tags tag SomeTag
  • 注入的依赖项应该是公开访问的还是私有的?

    是否应该将依赖项存储到具有私有 setter 和公共 getter 的私有字段或属性 这适用于构造函数 DI 需要明确的是 在属性示例中 我不希望将它们添加到随附的接口中 除非有意义 即它们仅在实现类型中可见 interface IFoo