使用存储库的依赖注入

时间:2014-05-28 17:59:58

标签: dependency-injection inversion-of-control

假设我有一个AlbumRepository类(专辑表)和SongRepository类(歌曲表)。

一张专辑有几首歌。

这是专辑类(伪代码)

class Album{
    protected Title;
    protected AlbumID;
    protected Metadata;

    public Song[] getSongs(){
        SongRepository songRepository = new SongRepository();
        return songRepository.whereAlbumID(this.AlbumID);
    }
}

我想重构这段代码,所以它没有在getSongs方法中实例化SongRepository,但是我该怎么做?

我可以在getSongs方法中要求SongRepository ....

public Song[] getSongs(SongRepository songRepository){
    return songRepository.whereAlbumID(this.AlbumID);
}

但是我真的想要没有参数的getSongs。

我应该在专辑构造函数中注入SongRepository吗?

但是如果有人在没有调用getSongs的情况下使用Album对象,则根本不需要SongRepository ......

我想问题是我应该在哪里注入SongRepository以便相册可以使用它?

1 个答案:

答案 0 :(得分:1)

SongRepositoryAlbum的依赖关系。因此,DI告诉我们Album不应该直接实例化它,而应该提供它。如果Album在没有SongRepository的情况下无法正常运行,则应该需要一个实例to be provided to its constructor(如您所疑)。

对于使用Album而不调用getSongs的代码 - 为什么会出现问题?使用Album的代码不应与实例化 Album的代码相同(对象创建是应该委派给composition root的责任)

相关问题