我目前正在测试 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 中是否有管理索引(包括上述唯一索引)的最佳实践?
例如,它们应该基于模型元数据并在引导程序中使用 DI 加载,还是应该更像 Automapper.CreateMap 那样加载?
我知道这是一个有点漫无目的的问题,但任何想法、想法或建议的阅读材料都非常感谢。
谢谢
苹果
这个问题包含很多不同的方面。开始吧。
通常 db4o 使用对象同一性 http://developer.db4o.com/Documentation/Reference/db4o-7.12/net35/reference/html/reference/basic_concepts/object_identity.html来区分不同的物体。所以通常你不使用任何 id。然而,在 Web 应用程序中,您会丢失请求之间的对象标识,因此无法使用 id。
The 可以使用 db4o 的内部对象 ID http://developer.db4o.com/Documentation/Reference/db4o-7.12/net35/reference/html/reference/implementation_strategies/ids_and_uuids/internal_ids.html为了那个原因。然而,当您对数据库进行碎片整理时,此 ID 可能会发生变化。我猜你想拥有永久的 id 来启用链接等。所以这些 id 不是一个选项。指南或db4o-UUID http://developer.db4o.com/Documentation/Reference/db4o-7.12/net35/reference/html/reference/implementation_strategies/ids_and_uuids/unique_universal_ids.html可以用作 id。然而两者都很长。
我认为最好的解决方案是添加一个表示对象 ID 的字段。然后你索引该字段 http://developer.db4o.com/Documentation/Reference/db4o-7.12/net35/reference/html/reference/tuning/indexing.html也许添加唯一的约束 http://developer.db4o.com/Documentation/Reference/db4o-7.12/net35/reference/html/reference/implementation_strategies/unique_constraints.html到它。这使您还可以使用不同类型的 id。例如,这可以启用“/country/usa”,因为您使用 ISO 代码作为 id。对于简单的数字自动 ID,您可以使用聪明的 id 生成器 http://tunatoksoz.com/post/Id-Generation-for-db4o.aspx.
我不知道你提到的两个框架(KandaAlpha,S#arp)。听起来这东西还是有道理的。您实现添加特定行为的接口或属性。例如,一个属性告诉系统哪个字段是对象的 id。该属性确保该字段已建立索引,系统知道如何查询等。
在我的应用程序中,索引是通过属性添加的。您可以使用 db4o-IndexedAttribute。或者您可以添加自己的。一般来说,我认为两种方式,显式配置或对元数据执行相同的操作都是可以的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)