我目前正在测试 Db4o 的 asp.net MVC 2 应用程序想法,但有一些事情我不太确定最佳的继续方式。
我希望我的应用程序使用可猜测的路由而不是 Id 来引用我的实体,但我也认为我需要某种 Id 来更新场景。
例如我想要
/country/usa 而不是/country/1
我可能想更改键名称(可能不是在一个国家/地区,而是在其他实体上),因此我认为我需要一个 Id 来用作在更新其字段之前检索对象的引用。从其他评论来看,UUID 使用起来有点长,无论如何我更愿意使用我自己的 id 来清楚地分离关注点。
看看 KandaAlpha 项目,我对设计的某些方面不太热衷,更喜欢 S#arp 架构的一些东西,他们使用诸如 [domainsignature] 和 EntityWithTypedId、IEntityDuplicateChecker、IHasAssignedId、BaseObject 之类的东西和 IValidatable 在其实体中控制插入/更新行为,这看起来更干净、更可扩展,涵盖验证并很好地封装在核心和基础存储库类中。
那么将 S#arp 架构移植到 Db4o 是否有意义,或者我是否仍在考虑 oodb 世界中的 RDBMS?
在 Db4o 中是否有管理索引(包括上述唯一索引)的最佳实践? 例如,它们应该基于模型元数据并在 Bootstrap 中使用 DI 加载,还是应该更像 Automapper.CreateMap 那样加载?
我知道这是一个有点漫无目的的问题,但我们非常感谢任何想法、想法或建议的阅读 Material 。
谢谢 苹果电脑
最佳答案
这个问题包含很多不同的方面。让我们开始吧。
通常 db4o 使用 object-identity来区分不同的物体。所以通常你不使用任何 id。然而,在 Web 应用程序中,您会丢失请求之间的对象标识,因此无法使用 ids。
internal object ids of db4o can be used为了那个原因。然而,当您对数据库进行碎片整理时,此 ID 可能会发生变化。我猜你想拥有永久的 id 来启用链接等。所以这些 id 不是一个选项。 Guid 或 db4o-UUIDs可以用作 id。然而两者都很长。
我认为最好的解决方案是添加一个表示对象 ID 的字段。那你index that field也许添加 an unique constraint到它。这使您还可以使用不同类型的 id。例如,这可以启用“/country/usa”,因为您使用 ISO 代码作为 id。对于简单的数字自动 ID,您可以 use a clever id-generator .
我不知道你提到的两个框架(KandaAlpha,S#arp)。听起来这东西还是有道理的。您实现添加特定行为的接口(interface)或属性。例如,一个属性告诉系统哪个字段是对象的 id。该属性确保该字段已建立索引,系统知道如何查询等。
在我的应用程序中,索引是通过属性添加的。您可以使用 db4o-IndexedAttribute。或者您可以添加自己的。一般来说,我认为两种方式,显式配置或对元数据执行相同的操作都是可以的。
关于Db4o Mvc 应用程序架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2541789/