我应该封装我的 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 容器吗? 的相关文章

  • 当您没有对容器的引用时,是否可以让温莎城堡解决属性依赖关系?

    我们有一个包含多个项目的解决方案 代表我们应用程序的各个层 例如 Domain Data Logic WebUI 我们的温莎城堡容器是从我们的 Web 层引用的 然后我们通过我们的层将这些依赖项级联起来 例如 In Domain publi
  • 温莎城堡:强制解析器使用指定的构造函数

    这是示例 interface IComponentA class ComponentA IComponentA interface IComponentB class ComponentB IComponentB interface ICo
  • 如何从 IntelliSense 中隐藏公共方法

    我想从 IntelliSense 成员列表中隐藏公共方法 我创建了一个属性 当将该属性应用于方法时 将导致在构造其对象时调用该方法 我这样做是为了更好地支持部分类 问题在于 在某些环境 例如 Silverlight 中 反射无法访问私有成员
  • 修改类以封装而不是继承

    我所使用的代码库具有一个继承自的数据库类MDB2 http pear php net package MDB2 这构成了正在使用的 MVC 框架 自定义构建的事务 的基础 而模型又继承自 db 我相信你们中的一些人已经注意到 这会导致一个相
  • 单元测试 IoC 注册?

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

    我正在使用 Castle Windsor 来处理我的依赖注入 到目前为止它一直运行良好 然而 我现在正在尝试扩展我的项目并添加一些额外的库 我现在正在努力寻找利用 Castle 的最佳方法 我目前有以下程序集 MyProject Inter
  • 我应该封装我的 IoC 容器吗?

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

    当我尝试这样做时 Export typeof IMyService PartCreationPolicy CreationPolicy Shared private MyService Service get var service new
  • 有没有一种简单的方法可以向温莎城堡注册静态闭包?

    我一直在尝试使用命名委托而不是单一方法接口 这对于代码大小有一些优势 我们可以从以下内容开始 删除了一些换行符 以免夸大情况 public interface IProductSource IEnumerable
  • Unity / EntLib:将依赖项注入 CustomTraceListener

    抱歉 这是一个非常特殊的话题 所以很多人可能不感兴趣 但是 我需要做以下事情 我有一个应用程序 它提供对某种控制台窗口的日志记录 它是一个 WPF 窗口 因为应用程序要求 而且应用程序即使在这里也需要看起来很华丽 我们的特殊客户要求这样做
  • 如何覆盖温莎城堡中注册的组件?

    我刚刚开始使用 Windsor 所以请温柔点 我有一个场景 我希望能够覆盖 替换放置在 Windsor 容器内的组件 继续阅读 在我的产品代码中 我希望能够注册一个实现基类的组件 并使用容器来解析实现者 到目前为止 使用 container
  • MVC3 控制器构造函数 + Ninject

    我目前正在开发 MVC3 Web 应用程序 并遇到了 Ninject 的新问题 我在控制器中使用以下代码 public class TestController Controller public IRepository
  • 是否可以使用 AndroidAnnotations 注入模拟以进行测试?

    我还没有找到任何关于如何执行此操作的示例 我假设基于这样的例子这是不可能的 Bean MyImplementation class MyInterface myInterface 其中要注入的类已经确定 的补充johncarl answer
  • 我应该如何将 IoC DI 与此存储库模式结合使用?

    我正在使用在这个问题的答案中找到的存储库模式 为每个对象创建通用存储库与特定存储库的优势是什么 https stackoverflow com questions 1230571 advantage of creating a generi
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 如何为独立的 Illuminate IoC 容器创建 Illuminate/Support/Facade/App Facade

    在我的独立 没有 Laravel 项目中 我想使用 Illuminate IoC 容器 我还想通过访问应用程序容器App外观由提供illuminate support成分 我安装了这两个组件 v5 0 28 这是我的 简化的 代码 func
  • 温莎城堡生活方式问题

    我正在实现hangFire 它是我的项目中的一个作业调度库 我面临着与此相同的问题link https stackoverflow com questions 11873905 castle windsor lifestyle depend
  • IServiceLocator 接口是什么?

    据我了解 IServiceLocator 是一个抽象实际 IoC 容器的接口 我问的是与 Prism 相关的问题 我想在哪里用 Prism 替换 Unity https stackoverflow com questions 2621248
  • 创建新实例,同时仍然使用依赖注入

    环境的快速描述 我有一个代表聊天室并依赖于记录器的类 它与具有横切关注点的系统范围记录器不同 而是与特定聊天室绑定的记录器 它将该聊天室中的所有活动记录到其唯一的日志文件中 当聊天室创建时 我想打开日志文件 当聊天室被销毁时 我想关闭日志文
  • 有没有办法使值只能由嵌套类 VB.NET 的父级访问?

    总的来说 根据OOP范式 我对封装的理解基本上是这样的 如果成员是私有的 则只能由类访问 如果成员受保护 则只能由基类和任何派生类访问它 如果成员是公开的 则任何人都可以访问 如果我有一个嵌套类 我可以声明一个属性只能由该类及其嵌套的父类访

随机推荐

  • 放大镜显示 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 容器是否有意义 经验告诉我 我应该在我的应用程序和任何第三方组件之间放置一层封装