我是Guice的新手,所以希望这不是一个明显的问题...

我正在处理一个动态实例化我的应用程序课程之一的框架(让我们称呼它 C)使用反射,因此我无法控制其实例化。此外,我没有简单的方法可以访问新创建的 C 框架进行了实例化之后。这是什么 C 看起来像:

    public class C implements I {

        public C() {
            // this ctor is invoked by the framework so can't use DI here?
        }        

        public void initialize() {
            // this is a post instantiation hook which the f/w will invoke
        }

        private void m() {
            Dependency d = Dependency.getInstance();
            d.doSmth();
        }
    }

我想 C 获取 Dependency 使用di。这里 Dependency 显然是单身人士,但总体上不一定是这样。

我提出了两种可能的解决方案,这两个解决方案都没有很整洁,所以我想我会问专家:

  1. 静态注射。我努力看到这如何在服务定位器的反pationn上大幅度改善 - 我最终得到了非最终静态场,这些静态领域可以在外部进行操纵...嗯。

  2. 该框架支持一个钩子 C 在实例化后初始化自己( initialize() 上面显示的方法)。此方法可以使用Setter注入自注射新创建的实例。

使用2,我想这意味着更大的外部可及时性,但至少在单位测试之类的情况下更明确地暴露了依赖性。麻烦是:在这种情况下,我该如何接触Guice喷油器(不依赖另一个服务定位器)?我还读过(并且倾向于同意),在应用程序代码中明确指向喷油器是可疑的实践。

您的见解将不胜感激。

非常感谢,
基督教

有帮助吗?

解决方案

您可以尝试将静态注射提供商注射到C.静态注入中以进行测试。但是,提供商使Guice可以既懒洋洋地又能急切地验证您的依赖项。

public class C implements I {
  @Inject static Provider<Dep1> dep1Provider;
  @Inject static Provider<Dep2> dep2Provider;

  ...

  public void initialize() {
    Dep1 dep1 = dep1Provider.get();
    Dep2 dep2 = dep2Provider.get();
    ...
  }
}

其他提示

如果您通过静态变量和静态访问器方法提供GUICE喷油器,则可以这样解决:

public class C implements I {

    public C() {
        // this ctor is invoked by the framework, you can't do injection here.
    }        

    public void initialize() {
        MyGuice.getInjector().inject(this);
    }

    @Inject
    protected void init(Dep1 dep1, Dep2 dep2) {
        this.dep1 = dep1;
        this.dep2 = dep2;
    }

    private void m() {
        dept1.doSmth();
    }
}

静态调用有点像一个反图案,您可以用简单的注释删除该依赖性,如果您愿意使用执行代码编织或邮政编译步骤的解决方案,则可以照顾后构造器注入。这样,即使所有对象都没有初始化方法,您也可以注入所有对象。您可以在此处找到一个示例: 如何将模型对象注入extackj.

@Configurable
public class C implements I {

    public C() {
        // this ctor is invoked by the framework, you can't do injection here.
    }        

    @Inject
    protected void init(Dep1 dep1, Dep2 dep2) {
        this.dep1 = dep1;
        this.dep2 = dep2;
    }

    private void m() {
        dept1.doSmth();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top