Guice运行时依赖参数重新注入

pfh*_*pfh 7 java guice

关于Guice的问题.我还在学习它,但我能理解基础知识.

这个问题已经在网上问了几次,但从来没有一个具体的答案(没有我能找到).

说我的情况就像在图片上(类似的例子是在网上).

在此输入图像描述

public class Dog {}

public class Walk implements Walkable {
    private final Dog dog;
    private final boolean leash;

    @Inject
    public Walk(Dog dog, @Assisted boolean leash) {
        this.dog = dog;
        this.leash = leash;
    }

    public void go() {
    }
}

public interface Walkable {
    void go();
}

public interface WalkFactory {
    Walk create(boolean leash);
}

public class AssistedMain {
    public static void main(String[] args) {
        Injector i = Guice.createInjector(new AbstractModule() {
            protected void configure() {

                install(new FactoryModuleBuilder().
                        implement(Walkable.class, Walk.class).
                        build(WalkFactory.class));
            }
        });

        Walk walk = i.getInstance(WalkFactory.class).create(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都很棒.但问题是 - 我可以以某种方式将该对象实例重新注入"容器"(注入器),以便在依赖于此依赖关系的类上使用.

所以,让我们添加一个interface Person,class PersonImpl.

在此输入图像描述

新类源是:

public interface Person {
    void walkDog();
}

public class PersonImpl implements Person {
    private Walkable walkable;

    @Inject
    public PersonImpl(Walkable walkable) {
        this.walkable = walkable;
    }

    public void setWalkable(Walkable walkable) {
        this.walkable = walkable;
    }

    public void walkDog() {
        walkable.go();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,问题是 - 我能以某种方式将这个特定实例注入到添加的对象中.这是一个简单的例子,但我们可以假设这个类下面有10个级别的类.

我找到的解决方案不是很灵活.就像是:

Injector i = Guice.createInjector(new SimpleModule(false, dog));

然后绑定到具体实例.这不是很有活力.基本上,每次我需要不同的运行时/动态参数时,我都必须重新创建注入器.

Provider<T>是不错的FactoryModuleBuilder帮助,但我怎么能注入的对象回来?

这个问题有更动态的解决方案吗?

谢谢.

pfh*_*pfh 5

MPierce-同意。虐待尝试解释我形象化问题的方式(如果我错了,可以纠正我)。

可以说,它比服务更能管理的想法是源于“服务定位器”模式。

我们可以将应用程序划分为Service和Data类,或者您可以说我们拥有应用程序和基础结构代码 -“ Dependency Injection”,这是一本很棒的书。

因此,从本质上讲,依赖注入和依赖注入框架通常都很棒。用于解决基础结构或“服务”代码。

基本上,任何注入到Container / Injector中的动态(运行时)参数都将迫使您结束对象图

例如,我们有以下设计:

在此处输入图片说明

EmailMessage是运行时参数。可以将其“注入”到Container / Injector外部的电子邮件服务中,但结束对象图。如果我们要请求EmailDispatcher,在将EmailMessage注入EmailService之后(我重复说,在注入器外部完成),我们将无法再从注入器获取EmailDispatcher。

然后,您可以重新设计模型,使其“适合”动态参数的“容器/注入器”概念。

在此处输入图片说明

但是又一次,您迫使设计,突然,EmailDispatcher的职责太多了。它可以在没有很多基础设施类的情况下使用。

在此处输入图片说明

而且,当您具有如第三张示例图中所示的设计时,就不能使用Injector / Container来获取NextService3实例(也不能低于EmailDispatcher的级别)。

问题是- 如果您有任何动态(运行时)参数,则只能对需要动态参数的类之上的类使用依赖项注入,而您会忘记下面的类。

ew

正确?