国际奥委会的Andr​​oid框架匕首 - 如何注入一个嵌套的领域? [英] Android IOC Dagger Framework - How to inject a nested field ?

查看:95
本文介绍了国际奥委会的Andr​​oid框架匕首 - 如何注入一个嵌套的领域?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用匕首针对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.

这篇关于国际奥委会的Andr​​oid框架匕首 - 如何注入一个嵌套的领域?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆