gpt4 book ai didi

java - Guice 3 - 使用辅助注入(inject)时自动构建对象图

转载 作者:行者123 更新时间:2023-11-30 07:54:50 24 4
gpt4 key购买 nike

我感兴趣的是构造具有依赖项的对象的正确方法是什么,这些依赖项本身具有 @Assisted 参数。一个例子将更好地说明:

通常,对于没有 @Assisted 参数的依赖项,您可以简单地拥有一个复杂的对象层次结构,这些对象都有它们的依赖项,并且这些对象注入(inject)没有问题,我只需获取对象的实例并且它的所有依赖项都将生成并注入(inject),而无需我执行任何操作。

但是,如果我想更改它,以便对象层次结构中的某些依赖项具有 @Assisted 参数,那么我必须使用工厂自己创建这些实例,即:

public SomeConcreteService(@Assisted String string) {
this.string = string;
}

MyFactory myFactory = injector.getInstance(MyFactory .class);
SomeService myService = factory.getMyService("some string");

这会导致对象的干净实例化出现问题,因为我必须手动创建这些实例。并将它们传递到所需的对象中,这本质上使该对象的 DI 变得多余,我认为???即我需要使用 new 关键字并手动传递所有依赖项...

new MyComplexObject(myService, myOtherService)

如果一个或多个依赖项使用 @Assisted 参数,我该如何制作才能不必手动构建对象图?

最佳答案

您需要问自己的问题是,“为什么我要创建这个@Assisted,以及谁将创建这些对象?”

如果您使用 key 来获取所需的实例,那么您拥有的就可以了:

public class YourInjectableClass {
@Inject private MyFactory factory;

public void doStuff(String key) {
// You have a key, and your factory, so you can create the instance yourself.
SomeService service = factory.getMyService(key);
// [...]
}
}

但是,如果您使用 key 来获取实例创建实例来创建实例来获取您需要的内容,那么这似乎是有问题的。对于 child injectors 来说这可能是一个更好的问题:

public class YourInjectableClass {
@Inject private Injector injector;
public void doStuff(String key) {
// You need an OuterObject. So rather than calling
// new OuterObject(new InnerObject(factory.getMyService(key))), do:
OuterObject outerObject =
injector.createChildInjector(new OuterObjectModule(key))
.getInstance(OuterObject.class);
// [...]
}
}

由于整个依赖关系树都需要您的值,因此您可以将其视为注入(inject)的依赖关系。这可能会有点令人困惑,但可以让您不必让依赖项一直关心实例化细节。

或者,您可以创建一个手动 OuterObjectFactory 外观,它会手动调用 new。对于遗留代码来说,这可能是一个更好的解决方案,但可以通过确保一个类负责抽象实例化细节来帮助遵循单一职责原则。

<小时/>

注意我假设 SomeConcreteService 接受对象图可以提供的其他依赖项。如果没有,那么根本没有理由使用注入(inject):为 SomeConcreteService 提供一个公共(public)构造函数,并在需要时调用 new SomeConcreteService("your value here") 。尽管 Guice 花了一些功夫来抽象掉 new 的使用,但也没有必要创建数据对象或轻依赖对象,例如 HashMap 或 Date >.

关于java - Guice 3 - 使用辅助注入(inject)时自动构建对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807259/

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