问题标签 [inversion-of-control]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
72841 浏览

c# - 什么是温莎城堡,我为什么要关心?

我是一名长期的 Windows 开发人员,对 win32 和早期的 COM 有过初步了解。自 2001 年以来,我一直在使用 .NET,因此我非常精通 C# 和 CLR。在我开始参加 Stack Overflow 之前,我从未听说过温莎城堡。我已经阅读了温莎城堡的“入门”指南,但没有点击。

教这条老狗新技巧,并告诉我为什么要将 Castle Windsor 集成到我的企业应用程序中。

0 投票
1 回答
766 浏览

inversion-of-control - 为依赖注入设计类的指南

这个关于单元测试最佳实践的问题提到了为依赖注入设计类。这让我开始思考这究竟意味着什么。

刚刚开始使用控制容器的反转,我对这个问题有一些想法,所以让我把它们扔到墙上,看看有什么能坚持下去。

在我看来,一个对象可以拥有三种基本类型的依赖关系。

  1. 对象依赖性- 将由相关类使用的实际对象。例如 LogInFormController 中的 LogInVerifier。这些应该通过构造函数注入。如果该类的级别足够高以至于在构造函数中需要超过 4 个这些对象,请考虑将其分解或至少使用工厂模式。您还应该考虑为依赖项提供接口并针对该接口进行编码。
  2. 简单设置- 例如阈值或超时时间。这些通常应该有一个默认值,并通过工厂模式的构建器进行设置。您还可以提供设置它们的构造函数重载。但是在大多数情况下,您可能不应该强迫客户端必须明确设置它。
  3. 消息对象- 从一个类传递到另一个类的对象,接收类可能用于业务逻辑。一个示例是 LogInCompleRouter 类的用户对象。在这里,我发现最好不要在构造函数中指定消息,因为您必须在 IoC 容器中注册 User 实例(使其成为全局),或者在您拥有 User 实例之前不实例化 LogInCompleteRouter (为此您不能使用 DI,或者至少需要对容器的显式依赖)。在这种情况下,最好仅在方法调用需要它时才传入消息对象(即 LoginInCompleteRouter.Route(User u); )。

另外,我应该提一下,并不是所有的东西都应该 DI,如果你有一些简单的功能可以方便地分解到一次性类中,那么当场实例化可能是可以的。显然,这是一个判断电话;如果我发现编写一个类如

我可能不会打扰依赖注入它,只会让一个对象直接在 using 块内实例化它。推论是,如果值得为其编写单元测试,那么它可能值得注入。

那你们怎么看?欢迎任何额外的指导方针或对比意见。

0 投票
7 回答
5009 浏览

language-agnostic - 如何将参数传递给 IOC 框架中的构造函数

如何将参数传递给 IOC 框架中的构造函数?我想做类似的事情:(试图成为 IOC 框架不可知论者;))

这似乎在 StructureMap 中是不可能的。但我很想看到有人证明我错了。

其他框架是否功能更丰富?还是我以错误的方式使用 IOC 框架?

0 投票
3 回答
3042 浏览

inversion-of-control - 为延迟加载注入数据访问依赖项的正确方法是什么?

当我进行延迟加载时,注入数据访问依赖项的正确方法是什么?

例如我有以下类结构

如何获取对 _customer_dao 的引用到事务对象中?如果我希望事务至少看起来像 POCO,那么为构造函数要求它似乎没有任何意义。让 Transaction 对象直接引用 Inversion of Control Container 可以吗?这也显得很尴尬。

NHibernate 之类的框架如何处理这个问题?

0 投票
3 回答
1678 浏览

.net - IoC 容器 - 哪个最好?(。网)

我想了解人们对 IoC 容器的使用情况。我读过一些关于温莎城堡的好东西,但我知道很多人使用 StructureMap、Unity、Ninject 等。

提到的那些(以及我忽略的)之间有什么区别。强项?弱点?更合适(比如 StructureMap 对 ABC 很好,但对 XYZ 不太好)?

0 投票
0 回答
433 浏览

c# - 如何将对象而不是类型传递给 Windsor 容器?

我有以下课程:

这是演示者代码:

我想将当前实例传递ViewPageTPresenterviaWindsor而不是让它实例化一个新对象。我怎样才能做到这一点?谢谢。

0 投票
9 回答
14783 浏览

.net - 我应该使用哪个依赖注入工具?

我正在考虑在我们的用户界面中将 Microsoft Unity 用于我的依赖注入工具。

我们的中间层已经在使用 Castle Windsor,但我认为我应该坚持使用 Microsoft。

有人对最好的依赖注入工具有什么想法吗?

0 投票
6 回答
3622 浏览

oop - 使用回调时如何避免循环依赖?

在设计具有生产者/消费者关系的两个类时,如何避免循环依赖?这里 ListenerImpl 需要一个对 Broadcaster 的引用才能注册/注销自己,而 Broadcaster 需要一个对 Listeners 的引用才能发送消息。这个例子是用 Java 编写的,但它可以应用于任何 OO 语言。

0 投票
4 回答
648 浏览

dependency-injection - 我应该如何为 DI/IOC 订购我的 ctor 参数?

我是一个 DI 新手,如果这是错误的方法或愚蠢的问题,请原谅我。

假设我有一个创建/更新订单的表单,并且我知道它需要检索要显示的产品和客户列表。我想传入它正在编辑的 Order 对象,但我也想将 ProductsService 和 CustomersService 作为依赖项注入。

因此,我希望我的 IoC 容器(无论我使用哪个容器)来提供服务,但这取决于调用代码来提供要编辑的 Order 对象。

我是否应该将构造函数声明为将 Order 对象作为第一个参数,然后将 ProductsService 和 CustomersService 声明为,例如:

...或者依赖项应该先出现,Order 对象最后,例如:

有关系吗?这是否取决于我使用的 IoC 容器?或者,还有更好的方法?

0 投票
3 回答
1511 浏览

spring - 如果我关心 IOC,如何最好地在 Spring MVC 中修改我的模型

我正在使用 Spring MVC 构建一个应用程序。我想为应用程序中的每个控制器对我的模型进行某些更改。特别是,我想将某些额外的数据插入到模型中,这些数据将出现在应用程序的所有页面中。

我可以通过几种方式做到这一点:只需在每个控制器的末尾添加数据,使用模型的子类添加我的额外数据,使用包装我的模型的 ModelAndView 的子类,在使用之前使用包装模型的 VelocityView 的子类它...我确定还有其他选择。

但是我有一个“优雅”的约束:我不想在每个控制器中编写代码,我希望在一个唯一的地方定义这种行为。理想情况下,它将由我的 IOC bean 配置文件控制。

有没有人建议如何优雅地实现这一目标?