关于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帮助,但我怎么能注入的对象回来?
这个问题有更动态的解决方案吗?
谢谢.
MPierce-同意。虐待尝试解释我形象化问题的方式(如果我错了,可以纠正我)。
可以说,它比服务更能管理的想法是源于“服务定位器”模式。
我们可以将应用程序划分为Service和Data类,或者您可以说我们拥有应用程序和基础结构代码 -“ Dependency Injection”,这是一本很棒的书。
因此,从本质上讲,依赖注入和依赖注入框架通常都很棒。用于解决基础结构或“服务”代码。
基本上,任何注入到Container / Injector中的动态(运行时)参数都将迫使您结束对象图。
例如,我们有以下设计:

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

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

而且,当您具有如第三张示例图中所示的设计时,就不能使用Injector / Container来获取NextService3实例(也不能低于EmailDispatcher的级别)。
问题是- 如果您有任何动态(运行时)参数,则只能对需要动态参数的类之上的类使用依赖项注入,而您会忘记下面的类。
ew
正确?
| 归档时间: |
|
| 查看次数: |
3643 次 |
| 最近记录: |