为什么使用存储库模式或者请向我解释一下?

2024-01-02

我正在学习存储库模式并正在阅读使用 Entity Framework 4.1 和 Code First 的存储库模式 http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C and 通用存储库模式 - 实体框架、ASP.NET MVC 和单元测试三角 http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle关于他们如何使用实体框架实现存储库模式。

Saying

•对上层隐藏EF
•使代码更好地可测试

使代码更好地可测试我确实理解,但为什么要对上层隐藏 EF?

看看他们的实现,似乎只是用查询实体框架的通用方法包装了实体框架。其实这样做的原因是什么?

我假设是为了

  1. 松耦合(这就是为什么要对上层隐藏 EF?)
  2. 避免为同一查询重复编写相同的 LINQ 语句

我的理解正确吗?

如果我写一个 DataAccessLayer 这是一个有方法的类

QueryFooObject(int id)
{
..//query foo from entity framework
} 

AddFooObject(Foo obj)
{
.. //add foo to entity framework
}
......
QueryBarObject(int id)
{
..
}

AddBarObject(Bar obj)
{
...
}

这也是存储库模式吗?

对虚拟人的解释会很棒:)


我认为你不应该。

实体框架已经是数据库上的抽象层。上下文使用工作单元模式,每个 DBSet 都是一个存储库。在此基础上添加存储库模式会使您远离 ORM 的功能。

我在我的博客文章中谈到了这一点:http://www.nogginbox.co.uk/blog/do-we-need-the-repository-pattern http://www.nogginbox.co.uk/blog/do-we-need-the-repository-pattern

添加您自己的存储库实现的主要原因是,您可以使用依赖项注入并使代码更易于测试。

EF 开箱即用的测试性不高,但使用可注入的接口制作 EF 数据上下文的可模拟版本非常容易。

我在这里谈到了这一点:http://www.nogginbox.co.uk/blog/mocking-entity-framework-data-context http://www.nogginbox.co.uk/blog/mocking-entity-framework-data-context

如果我们不需要存储库模式来使 EF 可测试,那么我认为我们根本不需要它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用存储库模式或者请向我解释一下? 的相关文章

  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • ADO.NET 池连接无法重用

    我正在开发一个 ASP NET MVC 应用程序 该应用程序使用 EF 6 x 来处理我的 Azure SDL 数据库 最近 随着负载的增加 应用程序开始进入无法再与 SQL 服务器通信的状态 我可以看到有 100 个到我的数据库的活动连接
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd

随机推荐

  • 在 Java 中将常规日期转换为儒略日期,反之亦然

    我编写了一个简单的代码 将常规日期转换为儒略日期 对于需要相同转换的人来说 这是代码 public int convertToJulian String unformattedDate Unformatted Date ddmmyyyy i
  • 有没有办法直接从 C# 应用程序将文件写入 Azure Blob 存储?

    我正在尝试创建一个新的 C 控制台应用程序 直接从代码写入 blob 存储 我能够创建本地文件并将其上传到 blob 但要求是将内容直接写入 Blob 而不是创建文件并上传到 Blob 我无法实现这一点 我搜索了相关的网络资源 但找不到任何
  • 如何将 Symfony 发行版下载为 Zip 存档?

    我尝试下载 symfony 已有 2 个小时 但找不到可供下载的 zip 文件 我无法在我的网络上使用作曲家 这就是我想要 zip 的原因 我花了很多时间去 symfony 网站上的下载章节 但找不到任何 lts 版本的 zip 只有评估包
  • 获取蓝牙低功耗 (BLE) 设备通知的步骤是什么?

    我正在开发蓝牙低功耗 BLE 应用程序 我有一个测量体重的 BLE 设备 秤 我能够连接该设备 但我不知道如何从中读取数据 重量值 我想知道我的应用程序是否连接到任何 BLE 设备 那么要通过哪些步骤获得设备通知才能获取更新的数据 好的 以
  • HTML5表单验证-错误消息定制

    我有一个带有这样输入的表单
  • NSDictionary 过滤和排序

    我正在开发一个使用 JSON API 的应用程序 并且我正在使用 Objective C 框架的 JSON 将数据放入NSDictionary 字典是这样的 admitted
  • 如何通过R中的管道将输出发送到特定位置

    我正在编写一个小代码 比较两次并找到差异并以 HH MM SS 格式显示 library magrittr library lubridate s1 lt ymd hms Sys time s2 lt ymd hms Sys time 20
  • Windows Media Player COM 自动化可以在 VBS 中运行,但不能在 Python 中运行

    我尝试使用 Windows Media Player 通过 COM 播放音频文件 下面的代码在VBS中运行良好 Set wmp CreateObject WMPlayer OCX wmp settings autoStart True wm
  • 使用 STG 调用约定将 `foreign import prim` 与 C 函数一起使用

    我有一个简单的 C 例程 它接受四个字并返回四个字 gcc 可以对其进行优化并发出一些 GHC 不支持的 primops 我正在尝试对调用此过程的各种方法进行基准测试 但在尝试适应该技术时遇到了困难此处描述 http breaks for
  • 使用单一表单创建多个记录(非嵌套属性)

    在我的应用程序中 我有一个具有内容和作者属性的思想模型 我想用新的形式同时创造出多种想法 但这不是嵌套表单的情况 因为我没有使用任何关联的模型 请提出一些解决方案 提前致谢 您可以尝试使用以下解决方案 在您的查看文件中 Content Au
  • MVC 4 - 如何有条件地禁用此按钮?

    我想有条件地禁用此按钮 或隐藏它 如果Model BicycleSellerListingId不大于 0 不知道该怎么做 div using Html BeginForm Delete null new id Model BicycleSe
  • 如何将文件放入 Django 的固定装置中?

    我可以轻松地使用文件名填充 Django 固定装置中的 FileField 或 ImageField 字段 但该文件不存在 当我尝试测试我的应用程序时 它会失败 因为该文件不存在 如何在 Django 固定装置中正确填充 FileField
  • 自动实现的属性必须定义 get 和 set 访问器

    SQLCLR Visual Studio 2015 我是编写 CLR 代码的新手 编译 SQL CLR 函数时出现以下错误 我正在使用 Net 坐标库 https www doogal co uk dotnetcoords php 有问题的
  • 从字符串动态导入文件中的方法

    我有一个字符串 说 abc def ghi jkl myfile mymethod 如何动态导入mymethod 以下是我的做法 def get method from file full path if len full path 1 r
  • 将handlebars变量传递给客户端js文件

    我正在使用 Node js Express Handbars 构建一个应用程序 并正在寻找一种可以将车把数据从服务器传递到客户端 JavaScript 文件的方法 例如 server js var person name George ag
  • C 语言有哪些 XML API?

    它们都这么复杂吗 http msdn microsoft com en us library ms766497 VS 85 aspx http msdn microsoft com en us library ms766497 VS 85
  • 计算机多久会犯一次错误?

    我指的不是编程错误 这些错误实际上是由人类以某种方式造成的 而是在执行像将两个数字相加这样简单的操作时出现的错误 1 x 中预期出现错误的 x 范围是多少 就 CPU 而言 存在三种可能的错误来源 这些错误似乎在您的问题范围内 浮点舍入错误
  • 如何管理 ASP.NET 中触发事件的顺序?

    这个问题看似微不足道 但我没有通过谷歌找到答案 如果我在网络表单中有多个独立的控件 例如DropDownLists 和网格 我需要在另一个事件处理程序中使用来自一个事件处理程序的回发信息 因此我需要让它一次又一次地正确触发 我看到很多间接的
  • 针对多个 Web 请求的最佳多线程方法

    我想创建一个程序来爬行并检查我的网站是否有 http 错误和其他内容 我想使用多个线程来执行此操作 这些线程应该接受要抓取的 url 等参数 虽然我希望 X 线程处于活动状态 但仍有 Y 任务正在等待执行 现在我想知道执行此操作的最佳策略是
  • 为什么使用存储库模式或者请向我解释一下?

    我正在学习存储库模式并正在阅读使用 Entity Framework 4 1 和 Code First 的存储库模式 http www codeproject com Tips 309753 Repository Pattern with