国际奥委会的Android框架匕首 - 如何注入一个嵌套的领域? [英] Android IOC Dagger Framework - How to inject a nested field ?
问题描述
我用匕首针对Android的依赖注射。
我在主类的UserService对象:
I'm using Dagger for Android for dependency injections. I have a UserService object in a Main Class:
public class Main implements Runnable {
@Inject
UserService service;
@Override
public void run() {
for (User f : service.getUserByName("toto")) {
System.out.print(f.getM_Nom());
}
}
public static void main(String[] args) {
ObjectGraph objectGraph = ObjectGraph.create(new UserModule());
Main m = objectGraph.get(Main.class);
m.run();
}
}
我设法注入服务领域,并调用方法getUserByName()。
但是,在我的UserService,我有一个其他自定义对象(RepositoryUser级):
I managed to inject the "service" field and to call the method "getUserByName("")". But in my "UserService", I have an other custom object ("RepositoryUser" class):
public class UserService implements IUserService {
@Inject
RepositoryUser m_Repository;
@Override
public List<User> getUserByName(String name) {
return m_Repository.getAll();
}
}
我的问题是,这个领域没有注入:在m_Repository字段为空,我得到一个空指针异常,当我尝试使用我的RepositoryUser对象
My problem is that this field is not inject: the "m_Repository" field is null and I get a null pointer exception when I try to use my RepositoryUser object.
下面是我的供应商:
@Module(
injects = {UserService.class, Main.class, RepositoryUser.class}
)
public class UserModule {
@Provides
RepositoryUser provideRepositoryUser() {
return new RepositoryUser();
}
@Provides
UserService provideUserService() {
return new UserService();
}
}
任何想法?
在此先感谢!
推荐答案
有preferrable使用<一个href=\"http://stackoverflow.com/questions/1503584/dependency-injection-through-constructors-or-property-setters\">Constructor在这种情况下,注射。这可以实现如下:
It is preferrable to use Constructor Injection in this case. This can be achieved as follows:
主要
public class Main implements Runnable {
private final IUserService service;
@Inject
public Main(IUserService service) {
this.service = service;
}
@Override
public void run() {
for (User f : service.getUserByName("toto")) {
System.out.print(f.getM_Nom());
}
}
public static void main(String[] args) {
ObjectGraph objectGraph = ObjectGraph.create(new UserModule());
Main m = objectGraph.get(Main.class);
m.run();
}
}
UserService
public class UserService implements IUserService {
private final RepositoryUser m_Repository;
@Inject
public UserService(RepositoryUser repository) {
m_Repository = repository;
}
@Override
public List<User> getUserByName(String name) {
return m_Repository.getAll();
}
}
RepositoryUser
public class RepositoryUser {
@Inject
public RepositoryUser() {
}
/* ... */
}
UserModule
@Module(injects = Main.class)
public class UserModule {
@Provides
IUserService provideIUserService(UserService userService){
return userService;
}
}
处处 @Inject
注释是一个构造函数present,匕首可以自动创建该项目的一个实例。所以,当你要求在 UserService
构造一个 RepositoryUser
实例,匕首将看到 @Inject在
标注的构造,并用它来创建一个新的实例。我们不需要一个 RepositoryUser
@Provides
方法在这里。
Everywhere the @Inject
annotation is present on a constructor, Dagger can automatically create an instance of that item. So when you request a RepositoryUser
instance in the UserService
constructor, Dagger will see the @Inject
annotation on RepositoryUser
's constructor, and use that to create a new instance. We do not need an @Provides
method here.
在主要的
构造函数不能被实例化,因为它是一个接口。使用模块中的 IUserService
参数 provideIUserService
方法,我们告诉匕首,我们希望它来创建一个新的 UserService
实例。
The IUserService
parameter on the Main
constructor cannot be instantiated, since it is an interface. Using the provideIUserService
method in the module, we tell Dagger that we want it to create a new UserService
instance.
我们做对主
构造一个 @Inject
注释,但是我们要求它使用 ObjectGraph.get(类&LT; T&GT; clzz)
。因此,我们需要添加 =注入Main.class
给我们的模块。
We do have an @Inject
annotation on the Main
constructor, but we request it using ObjectGraph.get(Class<T> clzz)
. Therefore, we need to add injects = Main.class
to our module.
这篇关于国际奥委会的Android框架匕首 - 如何注入一个嵌套的领域?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!