我正在研究控制反转,特别是针对 Android 使用 Guice
和 RoboGuice
,我有一个问题。
我有一个返回资源(本质上是 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){
...
}
}
几个问题:
- 如何在
getResource
调用中构建新的Resource
?我会认为我想使用 IoC 而不是在方法中调用new
。 - 如果另一个类在构造函数中获取了一个
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/