Typescript干净的体系结构和内存中数据库/存储库

olhwl3o2  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(149)

我正在我当前的项目中实现干净的体系结构,我正在与存储库、数据源和术语作斗争。
我想用内存仓库测试我的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的方法是相同的。我还将有一个泛型InMemoryDataSourceSequelizeDataSource,它们都将实现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?

cbjzeqam

cbjzeqam1#

关于Clean Architecture中存储库的关键问题是:是否违反了Dependency Rule
假设您的储存库是在“界面配接卡”层中实作,而您的数据来源是在“框架”层中实作,则您的储存库必须不与concreate数据来源实作有任何相依性。
从这个Angular 来看,如果“默认情况下,我正在使用Sequelize实现构建仓库”意味着在应用程序的“主”组件中,您正在将Sequelize实现注入仓库构造器中,而不是在仓库的默认构造器中创建Sequelize示例,则选项2将匹配依赖规则。
有关如何在Clean Architecture中正确实现存储库的更详细讨论,您可以找到in this video

相关问题