考虑单元测试的数据库层设计

时间:2019-12-16 05:10:49

标签: c# asp.net-core

基本上,我需要一堆可以以不同方式实现的数据库访问接口,或者换句话说,可以与底层实际数据库分离:

interface IDbConnexion
{
    IDbCollection Collection { get; }
    Task Connect();
}

interface IDbCollection
{
    void Insert(Model model);
}

我将使用Collection进行CRUD。但是问题在于,对于特定数据库(例如MongoDB)的具体实现,我需要执行以下操作:

class MongoDbCollection: IDbCollection
{
    IMongoCollection<Model> _collection;

    void IDbCollection.Insert(Model model)
    {
        _collection.InsertOne(model);
    }
}

因为这是我自己的mongodb客户端包装程序,所以我需要包装IMongoCollection提供的每个方法,以便可以使用其全部功能。例如。如果我想使用InsertMany,则需要将自己的InsertMany的包装器添加到MongoDbCollection中。随着我需求的增长,MongoDbCollection也会膨胀。但是我不想这样做。我应该能够访问mongodb驱动程序提供给我的所有方法,而无需进行过多的工作。

所以我在考虑一种替代方法:

interface IDbConnexion
{
    IMongoCollection<Model> Collection { get; }
    ...
}

但是问题是我的界面与mongodb耦合。我的单元测试模型将仅出于编译目的而需要实现IMongoCollection

所以我的问题是:是否有一种设计模式可以让我完全访问具体的Collection属性,同时又可以方便地更改具体的实现方式。

0 个答案:

没有答案
相关问题