IoC 容器的使用;特别是温莎

2023-12-27

我认为这个问题的答案是如此明显,以至于没有人费心写这个,但已经晚了,我真的无法理解这个问题。

我一直在阅读 IoC 容器(在本例中为 Windsor),但我不知道如何从代码的各个部分与容器进行通信。

我得到了 DI,我已经做了穷人 DI(空构造函数调用具有默认参数实现的重载注入构造函数)有一段时间了,我可以完全看到容器的好处。然而,我错过了一个重要的信息:每次需要容器提供服务时,如何引用该容器?

我是否创建一个我传递的全局实例?当然不是!

我知道我应该这样称呼:

WindsorContainer container = new WindsorContainer(new XmlInterpreter());

(例如)当我想加载 XML 配置时,那么我该如何处理容器呢?此后每次创建一个新容器是否通过一些内部静态 majicks 或其他方式保留加载的配置,或者我是否每次都必须重新加载配置(我猜不是,或者生命周期无法工作)。

不理解这一点会阻碍我弄清楚生命周期是如何工作的,也无法继续使用一些 IoC 的强大功能

Thanks,

Andrew


99% 的情况下,每个应用程序都有一个容器实例。通常您在 Application_Start 中初始化它(对于网络应用程序),像这样 https://github.com/castleproject/Castle.MonoRail-READONLY/blob/45ac205867396b1b7ad287a872e5b20afd0af837/src/TempWeb/Global.asax.cs.

之后,这实际上取决于容器的使用者。例如,一些框架,例如Monorail http://www.castleproject.org/MonoRail/ and ASP.NET MVC http://www.codeplex.com/aspnet允许您拦截实例(在本例中为控制器)的创建,因此您只需在容器中注册控制器及其依赖项即可,每当您收到请求时,容器都会负责将其依赖项注入每个控制器。参见示例这个 ASP.NET MVC 控制器 http://mvccontrib.codeplex.com/SourceControl/changeset/view/6aa25407de83#src%2fSamples%2fMvcContrib.Samples.WindsorControllerFactory%2fControllers%2fHomeController.cs。 在这些框架中,您几乎不需要在类中调用甚至引用容器,这是推荐的用法。

其他框架不允许您轻松进入创建过程(例如 Webforms),因此您必须求助于像this one http://ayende.com/Blog/archive/2007/09/03/Rhino-Igloo-ndash-MVC-Framework-for-Web-Forms.aspx, or pull所需的依赖项(即显式调用容器)。要提取依赖项,请使用容器的静态网关,例如this one https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/commons/Rhino.Commons/RhinoContainer/IoC.cs或所描述的maxnk https://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor#367190。请注意,通过这样做,您实际上是将容器用作服务定位器,这不会解耦事物以及控制反转。 (见差异here http://martinfowler.com/articles/injection.html#ServiceLocatorVsDependencyInjection and here http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)

希望这能消除您的疑虑。

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

IoC 容器的使用;特别是温莎 的相关文章

随机推荐

  • 现代英特尔处理器有多少种超标量方式?

    我刚刚了解了超标量处理器 https en wikipedia org wiki Superscalar processor https en wikipedia org wiki Superscalar processor 我还了解到 随
  • SqlBulkCopy - 给定的 ColumnName 与源或目标中的任何列都不匹配

    我正在尝试使用 SqlBulkCopy 将数据复制到 SQL 数据库表中 但它 错误地 说列不匹配 他们确实匹配 如果我使用断点来查看正在映射的列的名称 它们是正确的 错误消息显示了列的名称 并且它是正确的 这是我的方法 我有一个相同的方法
  • 根据String生成唯一的Hash码

    我有以下两个字符串 var string1 MHH2016 05 20MASTECH HOLDINGS INC Financialshttp finance yahoo com q is s mhhEDGAR Online Financia
  • 将数据框折叠成单行并基于 R 行创建新列

    我有一个包含对象名称和该对象的统计矩列表的数据框 如下所示 Object Mean IQR Skew x 1 1 1 y 2 2 2 z 3 3 3 我想要的是为每一行创建带有统计矩和对象名称前缀的列 就像这样 xMean xIQR xSk
  • 如何编写递归打印程序

    Gurus 我想知道如何编写一个打印的递归函数 1 12 123 1234 例如 display 4 应该打印 1 12 123 1234 Code include
  • Redux router - 刷新后如何重放状态?

    我有一个多步骤表单应用程序 我正在努力思考如何保存我的 redux 状态并在刷新后重播它 在应用程序中后退 前进按预期工作 但浏览器刷新后 我之前的状态为空 理想情况下 我希望能够将先前的状态保存在与路径相关的会话存储中 以便稍后重播 但我
  • 在 HTML 画布中创建链接

    是否可以从 canvas 元素中呈现的文本创建 html 链接 没有简单的方法 您必须将链接文本绘制到画布上 然后检查鼠标单击情况 这是一个演示 html 页面
  • 与泛型的多重绑定

    我正在尝试创建一个Multibinder
  • ASP Classic 应用程序中的多部分/表单数据和 UTF-8

    我有一个问题我真的不明白 我正在尝试在 ASP 经典应用程序中上传文件 而不使用外部组件 我还想发布一些将存储在数据库中的文本 文件上传完美 我正在使用以下代码 问题是其他表单输入字段 我使用的是 UTF 8 但它们最终并不是 UTF 8
  • 后期绑定onclick事件

    以下是我的 javascript 的一部分 使用 jquery list a b c for var i 0 i lt list length i a click here a click function foo list i appen
  • Java中如何实现“按引用调用”?

    Java中如何实现 按引用调用 假设我们使用该术语的方式与自 1960 年代以来同行评审的计算机科学文献中使用该术语的方式相同 请参阅这个维基百科页面 https en wikipedia org wiki Evaluation strat
  • 在 MFC 应用程序中显示文本

    我需要在 MFC 应用程序中显示文本 我有一个示例文本 例如 在 mfc 应用程序中显示文本 假设我打算在其中绘制此文本的客户端窗口非常小 水平 以至于在一行中唯一可以容纳的文本是 显示文本 不显示 mfc 应用程序 字样 我的问题是 如何
  • pjsip 2.5.5 构建错误

    我正在尝试为 android 构建 pjsipNDK r13b 标准构建就像 configure android with opus home user pjsip pjproject opus dev lib工作完美 但我需要几个TARG
  • 如何使用另一个数组的长度来初始化 Rust 中的数组?

    我想初始化一个数组 其长度等于另一个数组的长度 fn foo array i32 let mut sum 0 array len 它会出错 error E0080 constant evaluation error gt test rs 2
  • Pyspark:在数据帧的不同组上应用 kmeans

    使用 Pyspark 我想将 kmeans 单独应用于数据帧组 而不是立即应用于整个数据帧 目前 我使用 for 循环对每个组进行迭代 应用 kmeans 并将结果附加到另一个表 但是有很多组会很耗时 有人可以帮我吗 多谢 for cust
  • 如何使图像在图像墙内反弹?

    我面临这个问题 在动画过程中 我希望鱼图像在背景图像 池塘 中移动 并且每当它撞到墙壁或图像边界时它就会弹开 使用svg方法和javascript方法 非常感谢任何可以提供帮助的人 再次感谢您花时间阅读并帮助解决这个问题
  • 如何将临时 MySQL 表转储到文件中?

    有没有一种方法可以创建转储 导出 保存临时 MySQL 表到磁盘上的文件中 sql 文件 类似于 mysqldump 创建的文件 抱歉 我第一次没有正确阅读这个问题 无论如何 我能想到的最好的方法就是使用SELECT INTO OUTFIL
  • mongodb 从一个值获取整个文档

    我想从单个值获取 mongodb 文档的所有值 例子 id id name name description description invite invite support server server developer develop
  • 同一行有多个命令

    我一直在尝试找到一些可以让我在 Vim 中的同一行上运行多个命令的东西 类似于在 nix 系统中使用分号来分隔命令或 在Windows中 有没有办法做到这一点 A bar 将允许你这样做 从 help bar 可用于分隔命令 因此您可以在一
  • IoC 容器的使用;特别是温莎

    我认为这个问题的答案是如此明显 以至于没有人费心写这个 但已经晚了 我真的无法理解这个问题 我一直在阅读 IoC 容器 在本例中为 Windsor 但我不知道如何从代码的各个部分与容器进行通信 我得到了 DI 我已经做了穷人 DI 空构造函