Component的组织关系与SubComponent

多个Component之间有相同的依赖,那么该如何处理它们之间的关系?

前言

先看下面一个场景

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public class Man {
    @Inject
    Car car;

    public void goWork() {
        ...
        car.go();
        ...
    }
}

public class Friend {
    @Inject
    Car car;    // 车是向 Man 借的

    public void goSightseeing() {
        ...
        car.go();
        ...
    }
}

Man 有一辆车,Friend 没有车,但是他可以借 Man 的车出去游玩下,提供 Car 实例的CarModule不变,那么我们应该怎么设计 Component 呢?

很多人第一时间会想到下面的这种设计:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@ManScope
@Component(modules = CarModule.class)
public interface ManComponent {
    ...
}

@FriendScope
@Component(modules = CarModule.class)
public interface FriendComponent {
    ...
}
// @ManScope  @FriendScope 都是自定义的作用域

这种做法是最简单的,把Component需要的依赖都在modules属性中声明,但是这样有两个问题:

  • 有时候依赖实例需要共享,例如上面的场景,Friend的Car是向Man借的,所以FriendCommonent应该使用ManComponent中的实例。
  • Scope作用域容易失效,例如carModuleprovideCar()使用@Singleton作用域,FriendComponentManComponent也要用@Singleton标注,但是它们都会持有一个Car实例。

所以FriendComponent需要依赖ManComponent提供的Car实例,这就是Component组织关系中的一种。