android - 控制反转新对象创建

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

我正在研究控制反转,特别是针对 Android 使用 GuiceRoboGuice,我有一个问题。

我有一个返回资源(本质上是 XML 或 JSON 字符串)的方法调用。

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

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

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

几个问题:

  1. 如何在 getResource 调用中构建新的 Resource?我会认为我想使用 IoC 而不是在方法中调用 new
  2. 如果另一个类在构造函数中获取了一个Resource,当我需要一个动态的String 时,如何使用Guice 容器来构造它在施工时间?我刚问了一个similar question并相信可能有一种特定的方法可以使用 Guice 来处理这个问题。

非常感谢!

最佳答案

我认为您可能对依赖注入(inject)有一些误解。您不需要在所有 情况下尝试避免使用new...您主要想避免使用new 来创建任何您认为可能希望能够进行模拟以进行测试,通常最好允许容器连接任何依赖于此类对象的类。

不过,您的 Resource 类听起来像是一个简单的值对象,您可以在进行的任何测试中轻松地手动创建它。它也不依赖于任何类型的服务……它只包含一个 String。因此没有理由尝试让容器创建它。

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

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

关于android - 控制反转新对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197304/

相关文章:

android - 如何在抽屉导航的主要内容 View 中使用多个 fragment

java - canvas 与 openGL 的功能是什么?

android - 在 4.4.2 上完全禁用/隐藏状态栏

java - 我可以用组合代替这种继承吗?

c# - 使用 StructureMap 的 Autowiring 器

java - 什么是简单英语的AOP、依赖注入(inject)和控制反转

android - 如何检测股票 Android 浏览器

java - 什么时候在 Spring 中使用 javax.inject.Provider?

java - 无法刷新注入(inject)到 JSF 2 Managed Bean 中的 JPA 2 实体

c# - Autofac、循环引用和解析外键的设计