问题标签 [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 投票
3 回答
3321 浏览

dependency-injection - 使用 [ImportingConstructor] 将调用对象导入使用 MEF 的构造函数参数

我正在将我的一些代码从一个与 MEF 做同样事情的专有系统转换为 MEF,我有一个关于如何完成我最近遇到的以下问题的问题。

我有一个典型的实体对象,看起来像这样:

以及一个需要导入到上述实体对象中的服务对象:

为了把它说成话,我需要account传递给AccountServerService构造函数实例的参数是调用对象的Account对象。所以它的行为是这样的:

请让我知道这种情况是否可行,或者我是否必须在这种情况下重构我的服务接口。

0 投票
2 回答
10526 浏览

dependency-injection - GlassFish、CDI 和构造函数注入

GlassFish 3.1 的托管 bean 的 CDI 实现是否支持构造函数注入?我有一个@SingletonEJB,我想使用构造函数注入向其中注入另一个托管 bean(包含在同一个 EJB 模块中)。现场注入确实有效。但是通过构造函数注入,我得到了一个NullPointerExceptionfrom AbstractSingletonContainer

这确实有效:

这不起作用:

0 投票
1 回答
887 浏览

c# - Unity 应用程序块 - 配置文件中的构造函数注入

如何在创建对象时指定不带参数的构造函数?我知道如何为参数化的构造函数做这件事,但无法为无参数构造函数找到任何帮助。

我知道如何通过代码来做到这一点,但需要通过配置来做到这一点的解决方案。

0 投票
1 回答
540 浏览

asp.net-mvc-2 - Ninject 2.0:根据实现传递不同的参数

我刚刚开始使用带有 ASP.NET MVC 2 的 Ninject 2.0。所以,我有一个接口 IMongoRepository 和类 MongoRepository。

MongoRepository 接收参数字符串集合。

根据我要使用的集合,我在 MongoRepository 的参数中传入不同的值。我希望我的措辞正确,但是如何根据我使用的控制器映射不同的参数?

例如,在 Article 控制器中,我会调用:

在 PageController 我会调用:

我想做的只是进行构造函数注入并传入 IMongoRepository。有什么想法或建议吗?

顺便说一句,我只是在学习 IOC/DI;所以,我愿意接受国际奥委会忍者的任何提示!谢谢!

0 投票
1 回答
1670 浏览

assemblies - 如何在外部程序集中类型的构造函数注入中使用 Ninject

我正在从外部程序集中加载一个类型,并希望创建该类型的一个实例。但是,此类型/类是为当前由Ninject. 如何使用Ninject创建这种类型的实例并注入任何构造函数依赖项?

下面是我如何获得这种类型。

0 投票
1 回答
219 浏览

dependency-injection - DI,构造函数注入,模块,设计模式

我在参与的项目中遇到了一些架构问题。该项目是一个 ASP.NET MVC 2 应用程序,它依赖于 DI,尤其是使用 Unity 的构造函数注入。应用程序分为几个模块(每个模块是一组程序集),将服务暴露给其他模块。这些服务在应用程序启动时注册到 Unity。到目前为止没有什么特别的。假设我有这个(每个模块都是一个简化的程序集):

模块A,模块B。

ModuleA 使用以下方法公开服务“IServiceA”:

IServiceA(操作 1 - 操作 2 - 操作 3)

ModuleB 中的 ServiceB 需要 ModuleA 中的 IServiceA ,它通过构造函数注入(具有具体实现)来获取它。然后它使用它。

问题是当 ModuleA 被停用时(如果在应用程序启动时为当前用户激活了模块,我们会在数据库中检查),因此 serviceA 没有在 Unity 中注册。

然后我们在运行时出现异常,因为 unity 找不到 IServiceA 的注册并​​且无法构造 ServiceB。这是正常的。

我想知道有一套模式或最佳实践来处理它。我的第一个想法是摆脱 ServiceB 的构造函数注入。但是我应该使用对 ServiceA 的硬引用,但我不喜欢它,或者使用更糟糕的 ServiceLocator。如果 ServiceA 可用,我不想检查 ModuleB,因为我会检查许多其他服务,并且应该处理纯基础设施的代码。如果 serviceA 可用或不可用,我希望 ServiceB 运行相同的代码(不知道是否可能)。我查看了网关模式,但不知道这是否可以帮助我。

任何帮助将不胜感激。

谢谢,

0 投票
1 回答
1933 浏览

ninject - Ninject、Providers 和 Activator.CreateInstance

我对 Ninject 还很陌生,但我已经成功地使用自定义提供程序将它用于 DI。

绑定初始化如下

在自定义提供程序中,我像这样调用 Activator.CreateInstance

(是的,我知道上面的代码中没有错误处理等:))

这一切就像一个魅力。

现在,我面临的问题是当我引入一个希望注入 IPatientRecordLocator 实例的新类时。当我将如下构造函数添加到例如这些类之一时,就会出现问题

然后,为了使 Activator.CreateInstance 工作,我还必须向类 MockPatientRecordLocator 添加一个无参数构造函数,即

所以,我的问题是:如何让 Ninject 将实现 IContactAdapter 的类的实例注入到例如 MockPatientRecordLocator 中?我尝试过方法注入,但无济于事。

我忘了解释我想要实现的是一种链式注入,其中 PatientRecordSummary 类的实例被注入 MockPatientRecordLocator 的实例(使用构造函数注入),并且所述 MockPatientRecordLocator 的实例应该被注入 IContactAdapter 的实例(再次使用构造函数注入(如果可能))。链条的第一部分有效,第二部分无效。

0 投票
1 回答
818 浏览

dependency-injection - 是否可以使用 Unity 将参数注入受保护的构造函数?

我可以在温莎城堡做到这一点:

这在 Unity 中可行吗?我试过这样做,但它抱怨它找不到构造函数。看来我只能通过子类型注入。

0 投票
1 回答
2627 浏览

dependency-injection - 构造函数注入以及何时使用服务定位器

我正在努力理解 StructureMap 的部分用法。特别是,在文档中声明了一种常见的反模式,即仅使用 StructureMap 作为服务定位器而不是构造函数注入(直接来自 Structuremap 文档的代码示例):

代替:

这对于一个非常短的对象图来说很好,但是当处理很多层次的对象时,这是否意味着您应该从顶部向下传递更深的对象所需的所有依赖项?当然,这会破坏封装并暴露太多关于更深层对象实现的信息。

假设我正在使用 Active Record 模式,因此我的记录需要访问数据存储库才能保存和加载自身。如果此记录加载到一个对象中,该对象是否调用 ObjectFactory.CreateInstance() 并将其传递给活动记录的构造函数?如果该对象在另一个对象内部怎么办。它是否将 IRepository 作为自己的参数从更远的地方开始?这将向父对象公开我们此时正在访问数据存储库的事实,外部对象可能不应该知道这一点。

任何想法将不胜感激。

西蒙

编辑: 意见似乎是注入应该从顶层开始。ActiveRecord 将被注入到 ThingThatNeedsRecord 中,而 ThingThatNeedsRecord 又被注入到 OuterClass 中。这样做的问题是,如果 ActiveRecord 需要使用运行时参数(例如要检索的记录的 id)进行实例化。如果我在顶部将 ActiveRecord 注入到 ThingThatNeedsRecord 中,我必须以某种方式弄清楚此时需要什么 id(它将顶层暴露给它不应该实现的实现),或者我必须有一个部分构造的 ActiveRecord并稍后设置 Id。如果我需要 N 条记录并且直到在 ThingThatNeedsRecord 中执行逻辑才会知道,这会变得更加复杂。

0 投票
2 回答
3138 浏览

autofac - 如何使用 Autofac 注入同一对象的两个实例?

我正在使用 Autofac 构造函数注入。我需要弄清楚如何将单个对象实例注入多个构造函数参数,而无需在容器设置阶段显式解析每个参数。

我有一个复杂的场景,可以通过这种行为来简化;以下示例只是一个简化的场景,因此我可以演示我正在寻找的行为。

例子:

假设我有这两个接口,IOpenable 和 ICloseable:

我有一个实现它们的 Door 类:

我有一个接受 IOpenable 和 ICloseable 的类:

问题:

每当 IOpenable 和 ICloseable 都是同一个构造函数中的依赖项时, 是否可以告诉 autofac 将相同的 Door 对象注入到两个参数中?

注意:我不能这样做

做我想做的,但请记住这个 DoorHandler 类只是一个例子。在我的真实代码中,“DoorHandler”实际上是一个 MVC 控制器,我正在使用 RegisterControllers() 注册它。所以我不能像上面那样注册它。此外,有时依赖图可能会变得过于复杂,并且在每种情况下都明确地执行此操作会变得不堪重负。

我想我正在寻找的是能够做类似的事情:

c.ResolveShared<T>如果在同一个构造函数中调用多个参数,where 调用将全部解析为同一个 T 对象。

也许:

显然,如果我对 Door 对象使用 InstancePerLifetimeScope 或其他东西,每个已解析的 Door 都将是同一个实例。但我不希望这样,每次创建 DoorHandler 时我都想要一个 Door 的新实例,并且我希望将该 Door 作为两个参数传递给 DoorHandler 构造函数。