基本上,我需要一堆可以以不同方式实现的数据库访问接口,或者换句话说,可以与底层实际数据库分离:
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
属性,同时又可以方便地更改具体的实现方式。