这个问题已经在网上问了好几次,但从来没有一个具体的答案(没有我能找到).
假设我的情况就像图片一样(类似的例子就是在网上).
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); } }
这一切都很棒.但问题是 – 我可以以某种方式将该对象实例重新注入“容器”(注入器),以便在依赖此依赖关系的类上使用.
所以,让我们添加一个接口Person,类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(); } }
所以,问题是 – 我能以某种方式将这个特定实例注入到添加的对象中.这是一个简单的例子,但我们可以假设这个类下面有10个级别的类.
我找到的解决方案不是很灵活.就像是:
Injector i = Guice.createInjector(new SimpleModule(false,dog));
然后绑定到具体实例.那不是很有活力.基本上,每次我需要不同的运行时/动态参数时,我都必须重新创建注入器.
提供者< T>很好,FactoryModuleBuilder有帮助,但我怎样才能将对象注入?
这个问题有更动态的解决方案吗?
谢谢.
解决方法
最初源于“服务定位器”模式,它可以管理多于服务的想法至少可以说是乐观的.
我们可以将应用程序拆分为服务和数据类,或者您可以说我们有应用程序和基础结构代码 – “依赖注入”,这是一本很棒的书.
因此,基本上,依赖注入和依赖注入框架通常都很棒.用于解决基础架构或“服务”代码.
注入Container / Injector的任何动态(运行时)参数都基本上迫使您结束对象图.
例如,我们有以下设计:
EmailMessage是一个运行时参数.它可以“注入”Container / Injector之外的电子邮件服务,但它会结束对象图.如果我们想要请求EmailDispatcher,在我们将EmailMessage注入EmailService之后(我重复一次,在注入器外部完成),我们就无法再从注入器中获取EmailDispatcher.
然后,您可以重新设计模型,使其“适合”动态参数的Container / Injector概念.
但话说回来,你强迫设计,突然之间,EmailDispatcher有太多的责任.它可以用在这样的环境中,你没有很多基础设施类.
当你在第三个示例图片中有一个类似于你的设计时,你不能使用Injector / Container来获取NextService3实例(也不能低于EmailDispatcher的级别).
问题是 – 如果你有任何动态(运行时)参数,你只能对需要动态参数的类上面的类使用依赖注入,你可以忘记下面的类.
唷.
正确?