我正在学习DDD(域驱动设计)和存储库模式(在C#中)。我希望能够使用存储库模式来坚持一个实体,而不关心实际使用哪个数据库(Oracle,MySQL,MongoDB,RavenDB等)。但是,我不确定如何处理数据库特定的ID:大多数(所有?)数据库使用的数据库。例如,RavenDB要求它应该存储的每个实体都有一个字符串类型的id属性。其他可能需要一个int类型的id属性。由于这是由不同的数据库处理不同,我不能使数据库ID成为实体类的一部分。但是至少当我存储实际的实体时,它必须在某个时刻存在。我的问题是关于这方面的最佳做法是什么?使用存储库模式抽取数据库特定的id:s?
我目前正在追求的想法是,对于我想要支持的每个数据库,为每个业务对象类型实现特定于数据库的“值对象”。这些值对象然后将具有数据库特定的id属性,并且我会在读取和写入之间映射两者之间的映射。这似乎是一个好主意吗?
你真的需要它吗?对于我来说这似乎不是个好主意,因为你会遇到维护地狱。 – xelibrion
我同意xelibrion在这里。 – NotMe
我正面临同样的问题。不幸的是,这里提到的解决方案中没有一个将我描述为“完美的解决方案”(如果有的话......)。我也考虑过转换为数据抽象层中的特定实现类型。我的意思是,虽然'DTO'和'DAO'是所有DB类型通用的接口,但任何特定的'DAO'实现都会将方法内的'DTO'转换为相同的特定实现类型假设一次只使用一种数据库类型)。这样,它将能够使用特定的ID。这看起来很肮脏,但这是我迄今为止最好的。 – eitanfar