c# - 存储库应该公开实体对象吗?

标签 c# oracle entity-framework repository repository-pattern

我有一个实现接口(interface) IRepository 的存储库。存储库在 Entity Framework (代表)应用程序上执行查询并直接返回生成的实体对象。

实现 IRepository 的全部意义在于它可以在未来为不同的存储库切换。然而,返回 Entity Framework 返回的确切实体对象将打破这一点。这可以接受吗?

因此,存储库是否应该在将所有 Entity Framework 对象公开给应用程序之前将它们转换为业务对象?这些对象应该实现一个接口(interface)还是应该有一个共同的基类型?

最佳答案

存储库接口(interface)应仅处理业务/领域实体,即存储库仅发送和接收应用程序已知的对象,这些对象与底层持久性访问实现无关。

EF 或 Nhibernate 实体正在对持久性数据建模,不是领域数据。因此,IRepository 不应返回作为 ORM 实现细节的对象,而应返回应用程序可以直接使用的对象(领域实体或简化 View 模型,具体取决于操作)。

在存储库实现中,您处理 ORM 实体,这些实体将映射到相应的应用程序实体(通常使用 AutoMapper 等映射器)。长话短说,在设计 IRepository 时完全忘记它的实现。这就是为什么在决定是否/使用什么 ORM 之前设计界面更好。

基本上,存储库是应用域上下文和持久化上下文之间的网关,应用不应耦合到存储库的实现细节。

关于c# - 存储库应该公开实体对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9822107/

相关文章:

mysql - 有没有办法尝试像 jsfiddle.net 这样的 sql 命令

sql - 甲骨文 : Swapping table names

c# - EF6 中的方法链接不输出正确的 SQL

javascript - 使用iframe进行交叉数据交换

Oracle Clob 保存复杂的 XML;如何使用Xquery选择特定数据

c# - 对 ActionResult 进行单元测试

asp.net - 使用 MVC + Linq + EF 搜索页面

entity-framework - 使用模型优先方法时,如何向 Entity Framework 生成的自动生成类添加 XML 注释?

c# - 将 TabIndex 设置为 TextBlock

c# - 使用 AJAX 或 ASP.NET 进行异步调用?