问题标签 [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 回答
1195 浏览

asp.net-mvc - 在 Castle Windsor 中自动延迟解析组件

通过在容器中注册 LazyOfTComponentLoader 并按照此处Lazy<T>指定的方式解析 a ,可以延迟解析 Castle Windsor 中的组件:

但是,是否可以在容器中注册一个组件,以便它始终被解析为 aLazy<T>而无需在解析调用中指定 Lazy ?

具体来说,我想知道在使用构造函数注入时如何将惰性组件注入到 MVC 项目中的控制器中。

编辑:您可以Lazy<ISomeService> someService在控制器的构造函数中指定为参数,如此处所示。但是,有没有办法确保通过注册过程懒惰地解析组件?

0 投票
2 回答
357 浏览

java - Spring框架中的Java配置

我有课程AB以及他们的实现AImplBImpl.

要在 Guice 中配置依赖项,我会像这样编写 smt

在春天我可以做 smt like

有几个缺点

  • 我应该写下 AImpl 在 2 个地方(构造函数和配置)需要 B。
  • 我应该编写更多代码(CImp 和 AImpl 需要创建方法而不是一个表达式)

有没有办法在不做 xml 的情况下改进我的 spring 配置?

upd 我也不想用 @Component 之类的 spring 相关注释来污染我的类。我更喜欢构造函数注入而不是任何其他类型的注入。扫描也不是优选的解决方案。那么,我可以用 Guice 的方式做 Spring 吗?

更新2

所以我想要存档

  • 自动装配
  • 构造函数注入

没有

  • XML
  • 路径扫描
0 投票
1 回答
1885 浏览

default - 带有拦截器的 CDI bean 是否应该具有默认构造函数?

我有一个 CDI bean,并且在这个 bean 的一个方法中添加了一个拦截器。如果这个 bean 没有默认构造函数(我使用构造函数注入)。在运行时,我得到了异常

如果我在这个bean中添加一个默认构造函数,或者删除拦截器,就可以了。其实我可以使用字段注入来处理这个问题。

但我想知道:如果我添加一个默认构造函数,这意味着这个 bean 有两个构造函数——一个是非参数的,另一个是@Injected 参数。在这种情况下(使用拦截器),容器会创建两次实例吗?

编辑:我使用 Tomee1.5,WebShpere8.5 与 Tomee1.5 相同,GlassFish3.1.2 似乎没有这个问题。

编辑:我在 Tomee 用户论坛中找到了一个答案,即 CDI 容器将为您的 bean 调用 @Inject 带注释的 ct,但将使用默认 ct 来创建代理。所以,我认为这意味着如果你想使用构造函数注入,你还需要一个默认构造函数来进行代理。

编辑:

  1. 根据http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443 ,除非bean具有默认范围@Dependent,否则容器必须通过间接所有注入的bean引用一个代理对象。

  2. 根据 //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html CDI 容器将为您的 bean 调用 @Inject 带注释的构造函数,但将使用默认构造函数来创建代理。因此,所有 'NormalScoped' (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped) bean 都需要默认构造函数,因为它们总是会被代理。

  3. 如果一个bean使用了interceptor,根据报错信息,OpenWebBean使用Proxy来处理interceptor,所以被拦截的类必须有default构造。但是 Weld 使用拦截器和装饰器的子类。https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel 子类化解决方案优于代理,因为它避免了处理许多问题例如:在代理实例上没有无参数构造函数和字段访问的拦截类。所以,如果我使用 Tomee 和 Websphere,它需要一个默认 ct,但 GlassFish 不需要。

    谢谢brandizzi,这是我的第一个问题。谢谢您的帮助。似乎我无法回答我自己的问题并发布两个以上没有 10 个声誉的链接,所以我在这里进行了编辑。

0 投票
2 回答
1086 浏览

c# - 单元测试构造函数注入

假设我的Foo班级有以下内容:

到目前为止,我对构造函数进行了一个单元测试,我在其中传入 null 以验证是否ArgumentNullException抛出了一个。我是否需要对我的构造函数进行第二次单元测试,在其中我传入一个有效IService并验证该this.service设置(这将需要一个公共访问器)?

或者我应该只依靠我的单元测试Start来测试这个代码路径的方法吗?

0 投票
1 回答
712 浏览

c# - Ninject 可以使用匿名委托(func)作为 ConstructorArgument 吗?

我有一个存储库抽象类,它封装了几乎所有的 CRUD 功能:

KeyCompare属性在派生类中像这样使用,以便基类知道如何隔离存储库中的单个项目(并非所有“实体”都具有“Id”属性,并且某些键跨越多个列 - 此解决方案试图解决该特定点):

KeyCompare属性实际上是允许派生类仅实现该UpdateExisting方法的基石,如下所示:

其余的(实际的 CRUD)全部由基类处理。有了这个抽象存储库,我已经在几分钟甚至几秒钟内实现了具体的存储库,只编写了特定于每个实现的代码。干我渴了。

DataRepository<T>处理 SQL Server,所以我需要另一个模拟实现,我已经调用它ListRepository<T>并且做几乎完全相同的事情(除了ContextTransaction属性都 return null)。我认为构造函数的签名就是我需要在这里发布的全部内容:

所以现在我已经准备好进行测试了,我想使用 Ninject 作为我的 IoC 容器。我的问题是我似乎无法弄清楚如何将匿名委托作为ConstructorArgument

我正在尝试做的事情是可行的,还是过于复杂?我不会问它是否是好/干净的代码,但欢迎在这里提出建设性意见:

https://codereview.stackexchange.com/questions/25250/code-review-for-an-abstract-repository-implementation

0 投票
1 回答
805 浏览

c# - 在构造函数中结合依赖和值

我经常遇到一个问题,即有一个类既需要依赖项又需要初始化一些字符串值。例如考虑以下代码:

它的问题在于,由于附加的字符串参数,将其从 DI 容器中取出并不容易。解决此问题的最佳方法是什么?这些是我能想到的方式:

  1. Initialize 方法(这还不够好,因为它提供了 Mark Seeman 定义的时间耦合,我同意这不是一个很好的方法)
  2. 抽象工厂(我真的不需要额外的间接层,因为参数是一个配置,我在做配置的时候就知道了)
  3. 与示例中一样使用并在 DI 容器中注册类的实例
0 投票
1 回答
2012 浏览

java - 运行 JUnit 测试后 Bean 创建异常,而相同的 bean 配置在 Application Server 中运行而没有失败

我正在为 Web 应用程序上下文和 Junit 测试用例使用类似的 Spring bean 定义。它在运行测试用例时抛出org.springframework.beans.factory.BeanCreationException ,而在成功运行的 Web 应用程序上下文中使用相同的 bean 配置。这是失败的bean定义:

这是JackRabbitManagerImpl类的构造函数的签名:

这是唯一有两个参数的构造函数。

在运行测试用例时,bean jackRabbitManager的依赖关系已成功创建。它在创建jackRabbitManager时抛出org.springframework.beans.factory.BeanCreationException。这是异常的堆栈跟踪

我试图通过为构造函数参数提供类型来消除构造函数注入的歧义。但我仍然遇到同样的问题。

相同的 bean 定义在 Web 应用程序上下文中成功运行。请帮助我克服这个问题。

0 投票
1 回答
42095 浏览

java - 春天元素必须指定一个引用或值

我在使用 Spring 和构造函数注入时遇到问题。我想动态创建具有名称 ( String) 和特殊 ID ( long) 的对象。

但是当加载 spring.xml 文件时会发生异常。

线程“主”java.lang.ExceptionInInitializerError 中的异常

原因:org.springframework.beans.factory.UnsatisfiedDependencyException:创建在类路径资源[spring.xml]中定义的名称为“someBean”的bean时出错:通过类型为[long]的索引0的构造函数参数表示不满足的依赖关系:构造函数参数不明确类型 - 您是否指定了正确的 bean 引用作为构造函数参数?

我的spring.xml:

那么那里有什么问题呢?构造函数参数的索引为 1(而不是 0,如异常所说)

0 投票
1 回答
638 浏览

c# - 依赖注入,需要相同类型接口字典的类是个好主意吗?

虽然我在Code Review中问过这个问题,但原始代码现在正在蔓延。是的,我也是清洁代码讲座的忠实粉丝,刚刚看了那些很棒的视频,我也看到了另一个问题。这与我最初遇到的问题相同。

我有一门课说人类。人类基于其 Travel 方法中的某些决定可以调用 Horse、Camel 或 Ship To Travel,也可以要求所有这些人(在某些情况下) Travel。

所有的 Horse、Camel、Ship 都有 ITransport 接口,当然这个接口有 Travel 方法。

最初的问题是,在我的项目的生命周期中,我可能会得到一些新的交通工具,比如飞机、火箭、潜艇等。

所以我不能简单地将它们作为 ITransport 船、ITransport 马......等在构造函数中传递,因为我的构造函数参数将继续膨胀。

因此,我按照建议(我认为)提出了一个解决方案,即 HumanFactory 应该有一个事件,并且该事件应该在 Human 类的构造函数中传递。

尽管我以某种方式删除了我的大型运输列表,但正如您所知,接口可以有很多方法。所以现在我需要传递大量的委托,每个委托都对应于接口的一个方法,当然也需要根据需要传递。

我什至试图通过创建一个 Human Mapper 类来解决这个问题,该类的唯一职责是映射到正确的传输,调用正确的事件。这行得通!

现在,由于这是一个虚构的例子,在现实世界的例子中,接口的方法接受参数,那么我将如何处理呢?

我认为我要去的方向是创造一个维护噩梦。

我正在粘贴代码以供快速参考。

我的运输工厂是:

建议后我的人类班变成了:

我现在有一个人类类工厂,正如建议的那样:

我谈到了一个 Mapper 类,它将正确的传输映射到正确的方法(它看起来很丑,但这是我想出的最好的 :)):

现在看到在这种情况下,For Travel 方法如果有两个参数,那么委托签名会改变,如果 ITransport 接口中有四五个方法,那么请上帝帮助我。

我希望我已经在这里解释了我的问题。谢谢

编辑:我正在从这个问题中删除一些明显的代码,以使其更具可读性,而且它也变得更加冗长

0 投票
1 回答
417 浏览

c# - Ninject WithConstructorArgument 没有覆盖类型的全局绑定?

我有我的一般绑定,其中之一是:

这很好用,因为有几个类使用这个哈希。但是,有一个或两个控制器需要另一种类型的散列器才能将散列与 3rd 方一起使用,例如需要 md5 散列的 gravatar。那么我执行以下操作:

然后我的控制器看起来像:

在调试时,我希望 IHasher 是 Md5Hasher,但它是一个 Sha256Hasher。那么这是预期的行为以及使其使用覆盖类型的任何方法吗?