ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

c# – 使用存储库模式抽象出数据库特定的id:s?

2019-06-21 08:56:05  阅读:183  来源: 互联网

标签:c database repository domain-driven-design


我正在学习DDD(域驱动设计)和存储库模式(在C#中).我希望能够使用存储库模式来持久化实体,而不关心实际使用哪个数据库(Oracle,MySQL,MongoDB,RavenDB等).但是,我不知道如何处理数据库特定的id:s大多数(所有?)数据库使用.例如,RavenDB要求它应存储的每个实体都具有string类型的id属性.其他可能需要int类型的id属性.由于不同的数据库对此进行了不同的处理,因此我无法将数据库ID作为实体类的一部分.但它必须存在于某个时刻,至少在我存储实际实体时.我的问题是关于这个问题的最佳做法是什么?

我目前追求的想法是,对于我想要支持的每个数据库,为每个业务对象类型实现特定于数据库的“值对象”.这些值对象将具有数据库特定的id属性,并且我将在读取和写入时在两者之间进行映射.这看起来是个好主意吗?

解决方法:

这是泄漏抽象的经典案例.您不可能在存储库接口下抽象出数据库的类型,除非您想要丢失每个数据库附带的所有好东西. ID类型(字符串,Guid或其他)的要求只是巨大冰山的最高峰,其大部分质量都在泥泞的水域之下.

考虑事务处理,并发性和其他东西.我理解你对持久性无知的看法.确保不依赖于域模型中的特定数据库技术是一件好事.但是你也无法摆脱对任何持久性技术的依赖.

使用任何RDBMS使您的域模型运行良好相对容易.其中大多数都有标准化的数据类型.使用像NHibernate这样的ORM会对你有很大的帮助.在NoSQL数据库中实现相同的功能要困难得多,因为它们往往差别很大(实际上非​​常好).

所以我的建议是对你将要处理的可能的持久性技术集合进行一些研究,然后为持久性子系统选择适当的抽象级别.

如果这不适合您,请考虑事件采购.事件存储是最不需要的持久性技术之一.使用Jonathan Oliver的EventStore等库可以使用几乎任何存储技术,包括文件系统.

标签:c,database,repository,domain-driven-design
来源: https://codeday.me/bug/20190621/1253607.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有