.NET,分层架构和MongoDB - 使用什么作为ID?



我正在开发一个.NET web服务,同时试图维护一个分层架构,使我的模型保持在一个项目中,数据库访问(DAL)保持在另一个项目。这背后的想法是,如果我必须更改DB技术,只需要创建一个不同的DAL,而应用程序的其余部分保持不变。

在我正在开发的数据访问层中,我使用的是Mongo DB C#驱动程序。

我见过:

  • 名为"ID"的属性将由C#驱动程序映射为数据库的"_ID"(配置上的约定);

  • MongoDB中的Int+自动增量不是一个好主意;

  • 在MongoDB中使用Guid作为ID也不是一个好主意;

  • 建议存储在MongoDB中的文档ID的数据类型为ObjectID。C#驱动程序提供了一个类来表示这一点;

    • 但是,如果我在我的模型中使用这种数据类型(来自MongoDB.Bson),那么它们将依赖于MongoDB C#驱动程序,我不希望这样:我希望我的模型独立于DB;只有我的DAL可以依赖于我使用的任何数据访问技术

那么,为了保证数据库中的唯一性,我应该为POCO的ID使用什么数据类型?就性能而言,Guid的字符串表示会很糟糕吗?

欢迎您的反馈。

好问题。

根据经验,我可以说你是对的:GUID和自动增量都不是最好的主意(GUID比自动增量好得多),但这不仅是因为你链接的SO问题中提到的原因,而且主要是因为你需要意识到单调键与非单调键的含义。

使用ObjectIds,我看到三个选项:

  • 领域模型和DAL之间的映射。在域模型中,可以使用对象的字符串表示。这有点烦人,但它会迫使你分离关注点。

  • 使用您自己的数据类型并实现类型转换器/mongodb序列化程序。我还没有试过,但我不明白为什么这不起作用。

  • 接受MongoDB依赖关系。毕竟,如果真的交换数据库,那将是一项巨大的任务。不同的数据库具有非常不同的特性,并且需要非常不同的数据模型。一分钟内整个"交换数据库"都是假的IMHO,从来没有那么容易,数据库是一个比任何人都想承认的更容易泄露的抽象概念。试图保持独立是一个PITA。无论如何,对单词ObjectId进行查找和销毁将不到其他工作的1%。

最新更新