我正在我当前的项目中实现干净的体系结构,我正在与存储库、数据源和术语作斗争。
我想用内存仓库测试我的useCases
,因为在这个阶段我只关心我的业务逻辑,但是我不理解术语,想问一下。
我定义了一个基本的DataSource
,如下所示:
export interface DataSource<T> {
create(request: any): Promise<T>
// more methods here but removed for simplicity
}
然后我为Patient
定义了接口,如下所示:
export interface PatientRepository {
createPatient(patient: Patient): Promise<void>
// more methods here but removed for simplicity
}
我将使用一个Sequelize
进行生产和单元测试,只使用一个entities
的本地数组。
如果我正在执行PatientRepository
的实作,我应该:
选项1
我创建一个PatientSequelizeRepository
,它将实现我的合约中的方法,它将扩展一个抽象的SequelizeRepository
,它将实现DataSource
合约。然后我还创建一个PatientInMemoryRepository
,它将实现相同的方法,它将扩展和抽象InMemoryRepository
,它将实现DataSource
合约。然后在我的use-case
中导入PatientInMemoryRepository
,在我的app
合成中导入PatientSequelizeRepository
?
选项2
我创建了PatientRepository
的一个实现,并将一个data-source
赋给构造函数,因为PatientRepository
的方法是相同的。我还将有一个泛型InMemoryDataSource
和SequelizeDataSource
,它们都将实现DataSource
契约。因此,默认情况下,我使用Sequelize
实现构建存储库,但如果需要,我也会提供使用其他数据源的机会
export class PatientRepositoryImpl implements PatientRepository {
constructor(dataSource: DataSource<Patient>) { }
async createPatient(patient: Patient) {
return this.dataSource.create(patient)
}
}
export const patientRepository = new PatientRepositoryImpl(new SequelizeDataSource())
这里我对命名感到困惑。我正在将一个SequelizeDataSource
插入到构造函数中,但是我是否应该创建一个PatientSequelizeDataSource
,将其插入到构造函数中,然后对PatientInMemoryDataSource
执行同样的操作?这里最好的操作是什么?是否有可能是我没有考虑过的选项3?
1条答案
按热度按时间cbjzeqam1#
关于Clean Architecture中存储库的关键问题是:是否违反了Dependency Rule?
假设您的储存库是在“界面配接卡”层中实作,而您的数据来源是在“框架”层中实作,则您的储存库必须不与concreate数据来源实作有任何相依性。
从这个Angular 来看,如果“默认情况下,我正在使用Sequelize实现构建仓库”意味着在应用程序的“主”组件中,您正在将Sequelize实现注入仓库构造器中,而不是在仓库的默认构造器中创建Sequelize示例,则选项2将匹配依赖规则。
有关如何在Clean Architecture中正确实现存储库的更详细讨论,您可以找到in this video