问题标签 [constructor-injection]

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 投票
1 回答
9550 浏览

c# - TinyIoC 的构造函数注入

我刚刚从 Ninject 更改为 TinyIoC 进行依赖注入,但在构造函数注入时遇到了问题。

我设法将其简化为以下代码段:

这会导致 TinyIoCResolutionException 被抛出:

并且在该异常内部是一连串内部异常:

我使用构造函数注入的方式有问题吗?我意识到我可以打电话

这确实有效,但是结果是 Bar 的全局实例,这不是我所追求的。

有任何想法吗?

0 投票
1 回答
1424 浏览

dependency-injection - 有关使用单例的 Unity 配置的问题 - ASP.NET MVC3

我们一直在为我们的 ASP.NET MVC3 应用程序使用 Unity。配置仅在 web.config 文件中完成。请参见下面的示例,我们使用单例。我们正在使用构造函数注入。对于我们 99% 的课程,我们不使用单例生命周期属性。我们正在查看我们的性能,发现同一类的多个实例正在为同一请求构建多次。我们意识到,与其为每个请求生成 3000 个对象,不如将其减少到大约 200 个对象。我们可能有一个更大的设计问题,但那是另一天。我们正在考虑制作大量的统一类配置来使用单例。

问题:

  1. 将生命周期类型标记为单例时,该实例是仅针对特定用户还是所有用户群共享?
  2. 将这些标记为单例后,我们是否需要在方法上设置同步以避免用户一次执行多个请求的问题?
  3. 还有什么我应该注意的吗?
0 投票
1 回答
1158 浏览

unity-container - 在 Unity 中指定运行时参数依赖项

我有一个类在其构造函数中需要一个字符串作为参数,但这个参数将由调用代码决定。同时,这个类的生命周期必须与每个 HTTP 请求相关联。因此,我创建了一个自定义 PerWebRequestTimelineManager 并将其用于配置文件中的目标类型。但是由于必须动态确定构造函数中的字符串,所以我不能通过配置文件使用 ConstructorInjection。我可以使用抽象工厂来解决动态依赖的问题,但我不确定实现:你能检查下面的代码并验证方法吗?具体来说,RegisterType 和 Resolve 调用似乎有点不合适,尽管整个应用程序中的连续 Resolve 调用将能够检索相同的实例。:

配置文件的相关部分:

我有另一个问题。如果上述使用代码配置和注入依赖项的方式是正确的,那么我认为我不需要配置条目。我总是可以使用合适的重载来推送自定义生命周期管理器。如果我想只使用配置文件来实现同样的事情,那么我该如何编写解决方案呢?

0 投票
3 回答
98 浏览

c# - 如何处理这种 DI 解析场景?

所以,假设我可以画画:

我的问题的可怕描述

假设我有一个类A,它依赖于对象B并被C实例化,但C也依赖于 的实例B,并且我希望这个实例B与我传递给 的实例相同A。我怎样才能做到这一点?

现在,您可能根本不明白这一点;所以我会继续把它变成代码:

如果没有 DI,我会这样解决它:

我怎样才能通过 DI 干净地完成这样的事情?我想要的非常简单:在同时实例化和B时使用相同的实例。CA

忘了提到我确实希望在每个网络请求的生活方式中做到这一点,而不是单例或瞬态。

0 投票
5 回答
1264 浏览

unit-testing - 按合同设计,编写测试友好的代码,对象构造和依赖注入将所有最佳实践放在一起

我一直在尝试找出编写测试友好代码的最佳实践,但更具体地说,是与对象构造相关的实践。在蓝皮书中,我们发现我们应该在创建对象时强制执行不变量以避免我们的实体、值对象等的损坏。考虑到这一点,按合同设计似乎是避免我们的对象损坏的解决方案,但是当我们遵循这一点,我们最终可能会编写如下代码:

嗯,这乍一看还不错吧?似乎我们正在构建一个安全类来公开所需的合同,因此每次Car创建对象时,我们都可以确定该对象是“有效的”。

现在让我们从测试驱动的角度来看这个例子。

我想构建对测试友好的代码,但为了能够单独测试我的Car对象,我需要为每个依赖项创建一个模拟存根或一个虚拟对象来创建我的对象,即使我可能只是想测试一种仅使用这些依赖项之一的方法,例如StartEngine方法。遵循 Misko Hevery 的测试哲学,我想写我的测试,明确指出我不关心 Door 或 Wheel 对象只是将 null 引用传递给构造函数,但由于我正在检查 null,所以我不能这样做

这只是一小段代码,但是当您面对真正的应用程序时,编写测试变得越来越难,因为您必须解决主题的依赖关系

Misko 建议我们不应该在代码中滥用空值检查(这与契约式设计相矛盾),因为这样做,编写测试变得很痛苦,作为替代方案,他说最好编写更多的测试,而不是“有这样的错觉”我们的代码是安全的,因为我们到处都有空检查”

您对此有何看法?你会怎么做?最佳实践应该是什么?

0 投票
1 回答
2409 浏览

xaml - 在 XAML 中使用构造函数注入声明 ViewModel

我正在尝试 Unity,但在 XAML 中声明我的视图模型时遇到问题。你能帮我吗?XAML:

构造函数:

当我尝试执行时,我得到一个分辨率失败异常。当视图模型有一个空的构造函数时,这很有效。似乎构造函数注入有问题。

如果我像这样加载模块:

有用。

有没有可能用 xaml 做到这一点(我个人认为更好)?

顺便说一句:我正在使用 wpf 创建一个应用程序,该应用程序主要与 web 服务进行通信。我应该使用什么:unity 或 MEF,两者之间的最大区别是什么?

谢谢,拉菲

0 投票
3 回答
336 浏览

dependency-injection - 使用依赖注入时在哪里放置所需的初始化代码?

当我的构造函数是纯参数到属性设置器时,我不确定将类需要正常工作的其他代码放在哪里。

例如,在 JavaScript 中,我正在编写一个WindowMessageController处理对象message事件的程序window

为了使它起作用,我必须在某处附加处理程序:

这些东西正确地属于哪里?

  1. 在构造函数中
  2. 在 .initialize() 方法中 - 引入时间耦合
  3. 在 WindowMessageControllerFactory.create(applicableWindow) 中——对于如此核心的代码来说,这是一个相当遥远的地方。这意味着即使是这么小的班级也会被分成两部分。
  4. 在组合根本身中 - 这会在一直做时增加它的大小
  5. 在其他一些类 WindowMessageRouter 中,只有一个方法,即构造函数,使用此代码

编辑

这种情况似乎很特殊,因为在应用程序中通常只有一个这样的控制器实例。然而,在更普遍的情况下,如果我正在创建一个Button将包裹一些 DOM<button />元素的类的实例,那么答案是什么?突然一个

似乎更有用。

0 投票
2 回答
25567 浏览

spring - 使用Spring注解@Autowired的构造函数注入不起作用

我创建了 2 个简单的类。一个类的构造函数被注释为@Autowired。它接受另一个类的对象。但是这段代码失败了。

类:- 1)SimpleBean.java

2) 内部.java

当我尝试加载 ApplicationConext

它给出以下错误:-

如果我在 SimpleBean 类中引入无参数构造函数。它不会给出错误。但这并没有给我 SimpleBean 的预填充对象(如在 XML 配置中使用 <constructor-arg > )。那么在使用注解时,是否必须有无参数构造函数?什么是合适的出路?

0 投票
1 回答
361 浏览

.net - 与构造函数注入相比,属性注入有什么优势吗?

可能重复:
通过构造函数或属性设置器进行依赖注入?

如果Property Injection比Constructor Injection有任何优势,我很好奇:

对比

0 投票
1 回答
1161 浏览

dependency-injection - RavenDB 和构造函数注入

在我的项目中,我有以下PageCache实体,它存储在 RavenDB 中:

我正在使用 Castle WindsorIHtmlDocumentHelper在运行时注入实现。这个成员用于PageCache类内部定义的方法中,为了简单起见,我从上面的代码片段中删除了它。

当我使用构造函数创建PageCache对象时,一切正常。但在我的代码的其他地方,我PageCache从 RavenDB 加载对象:

我的问题是我从 RavenDB 返回的对象没有htmlDocumentHelper成员集,导致PageCache依赖它的方法无法使用。

换句话说:当我从存储在 RavenDB 中的文档中加载对象时,它不会使用我的构造函数来构建对象,因此不会通过构造函数注入来初始化私有成员。

我在这里做错了吗?你会如何解决这样的问题?


我最终使用了下面 Ayende 提出的解决方案。我在评论中提到的循环依赖问题仅在我DocumentStore在 Windsor 中使用UsingFactoryMethod(). 当我使用WindsorDependsOn()并直接在.OnCreate()DocumentStoreRegister()

我的容器现在正在初始化如下:

虽然它似乎工作正常,但我觉得不得不container.Resolve<CustomJsonConverter>()container.Register()方法内部调用很奇怪。

这是注册依赖项的合法方法吗?