我应该封装我的 IoC 容器吗?

2024-02-19

我正在尝试确定花费额外的精力来封装 IoC 容器是否有意义。经验告诉我,我应该在我的应用程序和任何第三方组件之间放置一层封装。我只是不知道这是否已经过分了。

我能想到我可能想要切换容器的情况。例如,我当前的容器停止维护,或者不同的容器被证明更轻量/高性能并且更适合我的需求。如果发生这种情况,那么我可能需要重新布线很多工作。

需要明确的是,我正在考虑注册的封装and类型的解析。我认为封装解析是理所当然的——我希望将 helper/util 类委托给容器是常见的做法。

EDIT:

假设我更喜欢以编程方式连接我的类型,以实现类型安全、编译时检查和可重构性。它是this代码及其对我希望保护自己免受的容器的依赖。

我还在其他几个项目中使用了 IoC 容器,这些项目共享许多相同的关系,但容器使用起来很痛苦,所以我想要改变。但是,更改意味着我失去了注册码的可重用性。因此,为什么我正在考虑封装。这不是一个巨大的负担,但我还是想减轻它。

我正在寻找:

  • 最大限度地减少容器/容器版本变更的影响
  • 跨可能使用不同容器的项目提供某种程度的类型注册一致性
  • 提供对我有意义的接口方法(RegisterSingleton 而不是 RegisterType( SomeLifetimeProvider ) - 以 Unity 为例)。
  • 随着条件/可扩展性要求的变化而增强容器,例如在解析/注册期间添加更好的缓存、日志记录等。
  • Provide my own model for registering type mappings.
    • 假设我想在程序集/包中创建一堆 RegistrationHandler 对象,这样我就可以轻松地跨多个类隔离注册职责,并自动拾取这些处理程序,而无需在其他任何地方更改代码。

我意识到这有点主观,所以优点/缺点可能会有所帮助

Thanks!


稍后再执行,并且仅当您确实需要更改 IOC 容器时才执行。

选择一个非侵入式的 IOC 容器。也就是说,相互连接的对象对 IOC 容器没有任何依赖性。在这种情况下,没有什么可以封装的。

如果您必须选择一个需要对容器具有依赖项的 IOC 容器,请选择一个具有最简单的依赖项/API 的容器。如果您需要替换此 IOC 容器(您可能不会),请实现将新 API 桥接到旧 API 的适配器。

换句话说,让第一个 IOC 容器成为defines任何未来容器的接口,这样您就不必发明自己的接口,并且您可以推迟任何此类工作,直到您绝对需要它为止。

EDIT:

我看不出有什么方法可以保证类型安全:

  1. 设计相对复杂的 Builder 模式实现以及可写入 IOC 配置文件或等效文件的访问者实现。
  2. 实现类型安全的 IOC 配置 DSL。 (如果我有多个需要可交换 IOC 容器的应用程序,我的选择。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该封装我的 IoC 容器吗? 的相关文章

  • 如果这些容器属于不同的层,那么每个应用程序拥有许多 Castle Windsor 容器是否正确?

    我最近一直在玩温莎城堡 并意识到我可以用它来支持我目前已经使用的类似容器的对象 到目前为止 我只阅读了有关每个应用程序只有一个容器实例的应用程序的信息 如果这些容器属于不同的层 那么每个应用程序有许多容器是否正确 我问这个问题的原因是因为我
  • 为什么封装是 OOP 语言的一个重要特性? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我遇到过不同的采访 其中有人问我为什么使用封装 封装实际上是谁的需求 是针对程序用户的吗 还是为了同事 或者是为了保护代码免受黑客攻击 封装有助
  • 当您没有对容器的引用时,是否可以让温莎城堡解决属性依赖关系?

    我们有一个包含多个项目的解决方案 代表我们应用程序的各个层 例如 Domain Data Logic WebUI 我们的温莎城堡容器是从我们的 Web 层引用的 然后我们通过我们的层将这些依赖项级联起来 例如 In Domain publi
  • Python 类中的公共变量?

    我现在正在自学 Python 课程 并发现了这个页面 http www tutorialspoint com python python classes objects htm http www tutorialspoint com pyt
  • 单元测试 IoC 注册?

    您是否应该对将组件注册到 IoC 容器中的代码进行单元测试 如果是这样 怎么办 在 Spring 中 您可以进行单元测试 只需加载应用程序上下文而不声明任何内容 它实际上是与自动构建结合使用的一个相当有用的测试 因为 spring 在加载完
  • ASP.NET MVC3 - 使用 DependencyResolver 和温莎城堡:为什么?

    有人能为我点亮一点光吗 我的网站全部使用温莎城堡运行 我有一个控制器工厂以及控制器和服务的安装程序 一切都很好 现在我刚刚创建了一个IDependencyResolver实现类称为WindsorDependencyResolver直接实施
  • 我应该封装我的 IoC 容器吗?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我正在尝试确定花费额外的精力来封装 IoC 容器是否有意义 经验告诉我 我应该在我的应用程序和任何第三方组件之间放置一层封装
  • 没有访问修饰符的方法

    好吧 这让我很烦恼 我知道我在某处读过它 但谷歌没有帮助 未指定访问修饰符的方法的可访问性级别是多少 void Foo code 我想说internal但我不是100 确定 默认可访问性type is internal 但该类型的默认可访问
  • 温莎城堡中的多个装饰器模式

    我们正在重新设计一些遗留软件以使其更具可测试性 并决定使用依赖注入和 Castle Windsor 来帮助我们 首先 我们的目标 许多装饰器都在数据流上工作 装饰器的多种组合是可能的 并且每种情况下的根节点可能需要从不同的地方获取数据 从技
  • 抽象和封装之间的区别?

    封装和抽象之间的确切区别是什么 这里的大多数答案都集中在 OOP 上 但封装开始得更早 每个函数都是一个封装 https en wikipedia org wiki Encapsulation 28computer programming
  • 有没有一种简单的方法可以向温莎城堡注册静态闭包?

    我一直在尝试使用命名委托而不是单一方法接口 这对于代码大小有一些优势 我们可以从以下内容开始 删除了一些换行符 以免夸大情况 public interface IProductSource IEnumerable
  • 如何编写库而不强迫用户使用库的 IOC 容器

    简短的问题是 给定一个图书馆warrants当应用程序使用该库时 在给定应用程序的情况下 将特定的 IOC 容器用于其内部warrants使用 IOC 容器来连接其依赖项 如果两个容器不同 它们如何才能很好地协同工作 场景是 应用程序定义了
  • 如何在与 Castle Windsor DI 容器相同的上下文中重用瞬态依赖项

    如果我有以下设置 当在同一上下文中创建对象时 如何将容器配置为使用相同的数据库 public class Database public interface IRepository Database Database get public
  • 在 ASP.NET MVC 的 Windsor 配置中,控制器的生活方式是否应该始终是瞬态的?

    我遇到了一个问题 我认为 Html DropDownList 会在我第一次提交表单时回发所选值 但每个后续回发只会发布初始回发中的数据 因此 我将生活方式 瞬态 添加到为温莎城堡配置控制器的组件元素中 这解决了问题 但当然使回发需要更长的时
  • Ninject:每个被拦截的类实例有一个拦截器实例?

    我目前遇到一个问题 尝试为每个被拦截的类实例连接一个拦截器实例 我正在 InterceptorRegistrationStrategy 中创建 Advice 并设置回调以解析来自内核的拦截器 它有一个注入构造函数 请注意 我只能在回调中实例
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • Autofac:解决对命名实例的特定依赖关系

    使用 Autofac 我想注册一个组件并指定要解析为命名实例的特定依赖项 我使用构造函数注入找到了如下示例 这几乎就是我想要的 builder Register c gt new ObjectContainer ConnectionStri
  • Unity(依赖注入):如何向RegisterType中的构造函数传入参数

    有人可以帮忙吗 我有一个 wpf 应用程序 应该没关系 在 Onstart 中我有我的 bootstrap 东西 就像这样 Create unity container my service and repository container
  • 在 C++ 中什么时候应该使用“friend”?

    我一直在阅读C FAQ http yosefk com c fqa 并且很好奇friend http yosefk com c fqa friend html宣言 我个人从未使用过它 但我有兴趣探索该语言 使用的一个很好的例子是什么frie
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo

随机推荐

  • 放大镜显示 UIWindow 后面

    我们有一个带有汉堡菜单导航的应用程序 菜单本身是一个位于键窗口后面的窗口 当用户长按一个uitextfield并调出放大镜时 放大镜会显示后面UIWindow的内容 有没有人有任何想法 Video https youtu be CvlLaF
  • fileUpload 在使用 JSF 2.2 的 PrimeFaces 3.5 中不会触发事件

    我无法在 PrimeFaces 3 5 上使用 fileUpload 组件来触发该事件 我读过很多关于该主题的帖子并遵循了那里的建议 但仍然不起作用 我尝试了所有模式 简单 自动 高级 但没有成功 如果我使用 JSF 规范中的标准 inpu
  • 实体框架最佳实践:哪一层应该调用 SaveChanges()?

    对于一个干净的数据模型 我会来回讨论这个 以审批工作流程为例 假设在我的 Web 应用程序中 我有一个页面 可让用户标记MyEntityObject需要批准 MyEntityObject有一些控制其审批工作流程的属性 因此我有一个通用的实用
  • swift 中的 C 数组内存释放

    var cpuInfo processor info array t nil var numCpuInfo mach msg type number t 0 var coresTotalUsage Float 0 0 var numCPUs
  • 缺少对 Nexus 的 PUT 的请求实体响应

    我正在尝试模拟发布到我的 Nexus 存储库的 Maven 工件 试图了解为什么我的 gradle 构建失败 I try curl u me secret X PUT T my artifact H Content Type maven a
  • 多集群并行方法中启动时的变量范围

    我正在尝试弄清楚如何将函数和包传递给boot 运行并行计算时的函数 在循环内加载包或定义函数似乎非常昂贵 这foreach 我经常用于其他并行任务的函数有一个 packages 和 export 参数来处理这个问题 请参阅此所以问题 htt
  • gpg:未找到有效的 OpenPGP 数据

    我正在尝试在 Ubuntu 13 10 上安装 Jenkins 当我尝试运行以下命令时 出现上述错误 wget q O http pkg jenkins ci org debian jenkins ci org key sudo apt k
  • 日期之间的月份差异[重复]

    这个问题在这里已经有答案了 可能的重复 月份差异 https stackoverflow com questions 1525990 difference in months Hi all 我们如何使用 LINQ 计算两个日期之间的月份差异
  • 如何以编程方式将网站添加到 Internet Explorer 11 兼容性列表?

    我尝试在以下位置添加注册表项 Hive HKEY CURRENT USER Key Path Software Policies Microsoft Internet Explorer BrowserEmulation PolicyList
  • 使用 jquery 获取 html5 的值

    前几天 我在 stackoverflow 中阅读答案 我读到 jquery 可以获取 html5 的值
  • memmove 实际上是否“移动”了一块内存并在源头留下了零? [复制]

    这个问题在这里已经有答案了 可能的重复 memcpy 与 memmove https stackoverflow com questions 4415910 memcpy vs memmove Does memmove http www c
  • github 存储库中的自定义语言

    Git 显示构成存储库的语言的百分比 然而 对于我的一个项目 我想使用我自己的自定义语言 我知道我可以创建一个 gitattributes 文件并放置 py linguist language Python使所有 py 文件被识别为 Pyt
  • 导入错误:没有名为“flask.ext”的模块[重复]

    这个问题在这里已经有答案了 当我像这样导入 Flask 扩展时 它工作正常 from flask module import Module 这样扩展就安装正确了 但每当我尝试像这样导入 Flask 扩展时 from flask ext mo
  • Webpack:未知属性“查询”?

    我正在练习使用 React 构建一个按钮 单击该按钮时计数器会加 1 我现在需要使用 Webpack 打包所有内容 以便可以在浏览器中运行它 我运行以下命令 webpack watch mode development 并得到以下错误 In
  • 全新安装时的 HDFS 空间使用情况

    我刚刚安装了 HDFS 并启动了该服务 并且已使用空间已经超过800MB 它代表什么 hdfs dfs df h Filesystem Size Used Available Use hdfs quickstart cloudera 802
  • Android 数据绑定:“使用‘.’的方法引用已弃用”

    在我的应用程序中使用数据绑定时 我在编译时收到以下警告 Warning Method references using is deprecated Instead of handler onItemClick use handler onI
  • 测试单元Spring boot:无法注册模拟bean

    我有两类测试 1 用于控制器类的单元测试 2 用于服务类的单元测试 如下所示 1 测试类控制器 RunWith SpringRunner class SpringBootTest AutoConfigureMockMvc public cl
  • 如何列出 JAR 的依赖项

    是否有一个工具可以列出包含 JAR 中引用的 第三方 类的第三方 包 假设它会从 JAR 文件定义中识别什么是 主 包 并且会打印出 JAR 中引用的第三方类的完全限定名称列表 最高可达第三级 org apache commons org
  • 使用 Tensorflow 可以实现增量学习吗?

    我正在尝试使用非常大的数据集 比我的记忆大得多 训练 Tensorflow 模型 为了充分利用所有可用的训练数据 我正在考虑将它们分成几个小 碎片 并一次在一个碎片上进行训练 经过一番研究 我发现这种方法通常被称为 增量学习 并基于这个维基
  • 我应该封装我的 IoC 容器吗?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我正在尝试确定花费额外的精力来封装 IoC 容器是否有意义 经验告诉我 我应该在我的应用程序和任何第三方组件之间放置一层封装