Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 存储库层是否需要在代码的其余部分不依赖于数据库ID?_Design Patterns_Repository Pattern - Fatal编程技术网

Design patterns 存储库层是否需要在代码的其余部分不依赖于数据库ID?

Design patterns 存储库层是否需要在代码的其余部分不依赖于数据库ID?,design-patterns,repository-pattern,Design Patterns,Repository Pattern,因此,据我所知,存储库层的整体思想是,您可以快速、轻松地将一个解决方案替换为另一个解决方案。比如说,我想从MySQL切换到MongoDB。我所需要担心的就是编写一个新的存储库层 到目前为止,一切顺利 问题是,MySQL(实际上很可能)将使用整数作为主键,而MongoDB将使用字符串。或者我希望我的存储库层指向一个web服务,谁知道他们使用什么样的ID 因此,为了给我的存储库层提供一个经得起未来考验的接口,我不能使用以下方法: EmployeeRepository.getById(int id)

因此,据我所知,存储库层的整体思想是,您可以快速、轻松地将一个解决方案替换为另一个解决方案。比如说,我想从MySQL切换到MongoDB。我所需要担心的就是编写一个新的存储库层

到目前为止,一切顺利

问题是,MySQL(实际上很可能)将使用整数作为主键,而MongoDB将使用字符串。或者我希望我的存储库层指向一个web服务,谁知道他们使用什么样的ID

因此,为了给我的存储库层提供一个经得起未来考验的接口,我不能使用以下方法:

EmployeeRepository.getById(int id)

那么一个人该怎么做呢?始终使用字符串(或对象??),让存储库层根据需要对其进行强制转换或转换

或者应用程序的模型是否应该有自己的内部ID方案,该方案完全独立于数据库的ID方案,并且您总是使用该ID进行获取?比如:

EmployeeRepository.getByInternalId(int id) 
这里的最佳实践是什么

因此,据我所知,存储库层的整体思想是,您可以快速、轻松地将一个解决方案替换为另一个解决方案

不,其思想是抽象数据层,以减少竞争性和代码耦合。而不是把所有的东西都放在一个班里,你会得到两个班,有更多的责任

即使使用存储库,从一种类型的数据层切换到另一种类型的数据层也不是一件小事

不过。您可以决定在一个存储库中使用一种数据层(例如,vanilla ADO.NET),在另一个存储库中使用另一种类型的数据层(如Entity Framework)。关键是,您可以在每个特定用例之后调整存储库。在不影响任何其他代码的情况下

问题是,MySQL(实际上很可能)将使用整数作为主键,而MongoDB将使用字符串

你从错误的方向处理这个问题。应用程序的用户是否使用密钥?是否必须采用特定的格式?或者DB生成的密钥是否正常?如果是,则使用DB使用的任何格式

如果您以后不得不从MySQL切换到Mongo,那么您仍有很多工作要做(比如从表关系转移到文档)

因此,据我所知,存储库层的整体思想是,您可以快速、轻松地将一个解决方案替换为另一个解决方案

不,其思想是抽象数据层,以减少竞争性和代码耦合。而不是把所有的东西都放在一个班里,你会得到两个班,有更多的责任

即使使用存储库,从一种类型的数据层切换到另一种类型的数据层也不是一件小事

不过。您可以决定在一个存储库中使用一种数据层(例如,vanilla ADO.NET),在另一个存储库中使用另一种类型的数据层(如Entity Framework)。关键是,您可以在每个特定用例之后调整存储库。在不影响任何其他代码的情况下

问题是,MySQL(实际上很可能)将使用整数作为主键,而MongoDB将使用字符串

你从错误的方向处理这个问题。应用程序的用户是否使用密钥?是否必须采用特定的格式?或者DB生成的密钥是否正常?如果是,则使用DB使用的任何格式


如果您以后必须从MySQL切换到Mongo,您还有很多工作要做(比如从表关系转移到文档)。

我将它们视为字符串。将ID视为整数(即使它们看起来是整数)可能会导致问题,例如,当超过32位限制时……我会将它们视为字符串。将ID视为整数(即使它们看起来是整数)可能会在例如超过32位限制时导致问题……理想情况下,应用程序的用户不关心密钥。不过,在处理人际关系方面,我仍然无法决定什么是最好的。模特们互相了解吗?我应该说“book.Author.Name”还是必须说(authorRepository.getByBookId(book.ID)).Name?在后一种情况下,应用程序确实关心数据库ID。在前一种情况下,模型确实需要是某种可以自动相互关联的实体,在这种情况下:它们是否渴望加载?有多少物体深?或者他们是在偷懒?怎么做?我更喜欢使用ID。它可以让您更好地控制更改的内容和时间。理想情况下,应用程序的用户不关心密钥。不过,在处理人际关系方面,我仍然无法决定什么是最好的。模特们互相了解吗?我应该说“book.Author.Name”还是必须说(authorRepository.getByBookId(book.ID)).Name?在后一种情况下,应用程序确实关心数据库ID。在前一种情况下,模型确实需要是某种可以自动相互关联的实体,在这种情况下:它们是否渴望加载?有多少物体深?或者他们是在偷懒?怎么做?我更喜欢使用ID。它可以让您更好地控制更改的内容和时间。
EmployeeRepository.getByInternalId(int id)