控制新对象创建的反转

时间:2011-11-19 21:00:51

标签: android dependency-injection inversion-of-control guice roboguice

我正在进入控制反转,特别是使用Android的GuiceRoboGuice,我有一个问题。

我有一个方法调用,它返回一个Resource(实际上是一个XML或JSON字符串)。

public Resource getResource(){
// Some implementation details that call a web service and throw the result in a string...
String resource = ........
}

Resource类实际上只是一个包裹的String,所以我认为在构造函数中传递它是有意义的,因为它是Resource对象的重要部分。

public class Resource{
   Resource(String theXMLorJSON){
   ...
   }
}

几个问题:

  1. 如何在Resource来电中构建新的getResource?我认为我想使用IoC而不是在方法中调用new
  2. 如果另一个类在构造函数中使用Resource,那么当我在构造时需要动态Guice时,如何使用String容器来构造它?我刚刚问了一个similar question并且相信可能有一种特定的方法可以使用Guice来解决这个问题。
  3. 非常感谢!

1 个答案:

答案 0 :(得分:2)

我认为你可能误解了依赖注入的问题。您无需尝试避免在所有案例中使用new ...您主要是希望避免使用new创建您可能希望能够创建的任何内容模拟出来进行测试,通常最好允许容器连接任何依赖于这样一个对象的类。

但是,您的Resource课程听起来像一个简单的价值对象,您可以在任何测试中轻松手动创建。它也不依赖于任何类型的服务......它只包含String。所以没有理由让容器创建它。

另一方面,

包含getResource()方法的类,您肯定希望容器能够创建,因为您希望能够在测试中使用依赖于该类的内容而无需实际调用一个网络服务。

请注意,如果您的类具有构造函数,该构造函数接受您希望由容器注入的依赖项和仅在运行时已知的参数,则需要使用仅接受运行时的方法创建某种类型的中间工厂参数。使用Guice,您可以使用Assisted Inject从界面自动创建这样的工厂(不确定它是否适用于RoboGuice,但也很容易手动创建这样的工厂实现)。