gpt4 book ai didi

java - 您如何处理在运行时与依赖注入(inject)框架一起创建的对象?

转载 作者:行者123 更新时间:2023-11-30 11:05:25 26 4
gpt4 key购买 nike

我喜欢依赖注入(inject)框架,以及它们如何让我请求一切都从一个对象开始。所有接线都是在第一次请求“主”对象时进行的。但是,有些对象应该在运行时创建,例如基于用户输入。有时,这些新创建的对象应该在框架创建的其他对象之间共享。

我目前的方法是让框架注入(inject)“未初始化”的对象。在运行时,我会尽快使用 setter 方法设置对象。

我不喜欢这种方法的地方在于,setter 方法实际上只被调用一次,以后再也不会被调用。这使我无法将字段声明为最终字段。我现在不知道如何在所有必要信息可用之前创建对象,同时又不会失去 DI 框架的所有好处。

我是 DI 新手。有什么好的模式吗?


例子:

// The service is used through out the application
interface Service {
makeRequest()
}

用户输入凭据后我想做什么:

new ConcreteService(username, password)
// but now I need to inject the concrete servive manually everywhere I need it!

我现在在做什么:

interface Service {
makeRequest()
setCredentials(username, password)
}
// service can be injected by framework, but I don't like setter methods
// that much (and they can pollute the interface)

最佳答案

我在依赖注入(inject)方面的大部分经验都来自于 C#,但我相信无论使用何种语言,这个概念都是一样的。

我从原始发帖人那里了解到,他正试图在依赖项注入(inject)容器中“保留”信息,以便稍后检索信息。

这种方法的问题在于,在多线程场景中,您用来保存信息的依赖项的值可能会被另一个线程覆盖。发生这种情况是因为依赖项注入(inject)容器通常包含该对象的单个实例,该实例会在您需要时返回给您。因此,您需要确保您的设计是线程安全的。

根据我的经验,使用依赖注入(inject)容器来维护状态是不好的。

您在依赖项注入(inject)容器中注册的是提供“服务”且不保持任何状态的对象。

您用来保存信息的对象通常是业务对象。这些业务对象应该只用"new"实例化(没有依赖注入(inject)容器),以通常的方式填充它们(使用 setter 或初始化方法或构造函数),并作为您服务的操作签名的一部分传递暴露。

注意:您可以将您的依赖项注册为“ transient ”,这将告诉依赖项注入(inject)容器在您每次请求依赖项时返回一个新实例。这将避免显式使用“new”关键字的需要,并在使用模拟框架编写单元测试时为您提供更多控制。

希望这对您有所帮助!

关于java - 您如何处理在运行时与依赖注入(inject)框架一起创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com