假设我在Mongo有三个系列:flavor
,color
和cupcake
。每个集合都有自己_id
(明显),并且在cupcake
集合引用_id
S IN flavor
和cupcake
像这样:如何在C#中使用类型安全的Mongo对象ID?
{
"_id": ObjectId("123"),
"flavorId": ObjectId("234"),
"colorId": ObjectId("345"),
"moreData": {}
}
这是一个玩具的例子,当然,并没有在这些集合更多的东西。这对这个问题并不重要,只不过它是我查询时真正需要的moreData
。
我希望能够查找cupcake
对象flavorId
和colorId
(并且它们适合于这种查找索引)。然而,这两个字段都是ObjectId
,我想避免有人不小心寻找colorId
与flavorId
。我如何设计对象和存储库类,以使colorId
和flavorId
为不同类型,以便编译器不允许交换它们,但仍将这两个ID存储为ObjectId?
我的第一个想法是扩展ObjectId并传递扩展对象,但是ObjectId是struct
,无法扩展。
这似乎有点多余?*,我想避免有人不小心寻找带有flavorId *的colorId。你不能允许有人引入错误 – Liam
这比引入这个特定的错误更容易。假设你有一个仓库对象,并且你认为,“我将通过'flavorId'获得所有'cupcake'对象。”所以你调用cupcakeRepository.Find(ObjectId flavorId),因为IntelliSense非常有帮助地提示它,而你没有读取参数名称。嘿,它编译!即使你的单元测试也通过了,因为你根据你认为的方法嘲笑了方法。 – meustrus
或'cupcakeRepository.Find(ObjectId colorId)'。我实际上忘记了在键入这两个句子之间我正在尝试使用哪一个。看,这不仅仅是关于其他开发者,这是为了保护我免受自己的伤害。 – meustrus