存储库模式与简单数据访问层有何不同?

2024-02-18

我对在研究存储库模式期间所读到的内容感到困惑。我想知道人们是否(错误地?)使用这个词,当他们只是指数据访问层时。

由于在索引中找不到“存储库”设计模式 https://rads.stackoverflow.com/amzn/click/com/0201633612(GoF),我转向企业应用架构模式 https://rads.stackoverflow.com/amzn/click/com/0321127420(福勒)。当福勒说时,他似乎很清楚(第 323 页)客户端创建一个条件对象并将其传递到存储库以获取结果。它看起来像这样:

public class Person
{
    public List<Person> Dependents()
    {
        Repository repository = Registry.personRepository();
        Criteria criteria = new Criteria();
        criteria.equal(Person.BENEFACTOR, this);
        return repository.matching(criteria);
    }
}

标准对象是使存储库成为存储库的原因吗?如果不是,那是什么?如果抽象持久性机制(并因此构建查询)是目标,那么存储库与简单的 DAL/ORM 调用有何不同,如下所示:

public class PersonLogic
{
    public List<Person> GetDependents()
    {
        IPersonData personData = DependencyContainer.Resolve<IPersonData>();
        return personData.GetDependents();
    }
}

对我来说,区别如下:
* 使用存储库模式,客户端构造不同的条件对象并调用其上的 Matching() 方法。
* 使用简单的DAL,客户端只需根据需要调用不同的方法即可。

还有比这更多的事情吗?程序员是否在真正指的是 DAL 时错误地使用了术语“存储库”?

EDIT

大卫·奥斯本将此链接发送至持久化模式 http://msdn.microsoft.com/en-gb/magazine/dd569757.aspx#id0400058。它指出:

基本上,存储库模式只是意味着在上面放置一个外观 你的持久性系统,这样你就可以保护你的其余部分 应用程序代码必须了解持久性如何工作。

这就是数据访问层的真正含义。在我看来,存储库和 DAL 确实是同一件事,也许“真正的”存储库使用标准对象。


看看“使用 IQueryable 接口”部分及以上扩展和增强订单和注册限界上下文 http://msdn.microsoft.com/en-us/library/jj591579。它对 DAO/Repository 实现进行了富有洞察力和平衡的讨论。

正如鲍勃·霍恩随后强调的那样,持久化模式 http://msdn.microsoft.com/en-gb/magazine/dd569757.aspx文章总结说:

基本上,存储库模式只是意味着在持久性系统上放置一个外观,以便您可以使应用程序代码的其余部分不必知道持久性是如何工作的。

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

存储库模式与简单数据访问层有何不同? 的相关文章

随机推荐

  • Python 2.X 在字符串周围添加单引号

    目前 要在字符串周围添加单引号 我想出的最佳解决方案是创建一个小型包装函数 def foo s1 return s1 有没有更简单 更Python化的方法来做到这一点 这是另一个 可能更Pythonic 选项 使用格式化字符串 https
  • 如何在执行一定次数后停止计划重复执行的 Runnable

    情况 我有一个可运行的 我有一个类 它使用 ScheduledExecutorService 来安排此 Runnable 执行固定延迟调度 http download oracle com javase 1 5 0 docs api jav
  • 格式“%s”需要“char *”类型的参数

    为了锻炼我的 C 编程技能 我尝试自己编写 strncpy 函数 在这样做的过程中 我不断地遇到错误 最终解决了其中的大部分错误 但我却没有进一步的灵感继续下去 我收到的错误是 ex2 1 c 29 3 warning format s e
  • 创建共享对象时,不能使用针对未定义符号的重定位 R_X86_64_PC32;使用 -fPIC 重新编译

    我最近将 gSOAP 从 2 8 7 升级到 2 8 76 我必须对升级进行一些小的代码调整 但升级后代码将无法像以前那样链接到计算机上 我正在尝试使用 gSOAP 在使用 g 4 9 2 的计算机上创建共享库 我压缩了代码以创建一个测试用
  • Go - formFile 用于多个文件

    formFile 函数工作完美 但是在文档中 http golang org pkg net http Request FormFile据说 FormFile 返回所提供的表单密钥的第一个文件 有没有办法获取 html 表单的多个文件 输入
  • Haskell 中惰性和 I/O 如何协同工作?

    我试图更深入地了解 Haskell 中的惰性 我今天想象了以下片段 data Image Image name String pixels String image String gt IO Image image path Image p
  • 使用卷时无法在主机上使用 mysql 套接字

    我来自这里 如何在主机网络上运行 docker compose https stackoverflow com questions 56203642 how to run docker compose with host network 我
  • 自定义 Laravel 关系?

    假设情况 假设我们有 3 个模型 User Role Permission 我们还说一下User与 具有多对多关系Role and Role与 具有多对多关系Permission 所以他们的模型可能看起来像这样 我故意让它们简短 class
  • 带分组的格式化选择

    现在有了 Formtastic 我有了简单的选择 f input category as gt select include blank gt false collection gt subcategories 这里我只显示儿童类别 我用作
  • 使用 FFTW 取消定义架构 x86_64 的符号

    Ceeloss MacBook Pro desktop ceelos gcc o prog I usr local include test c Undefined symbols for architecture x86 64 fftw
  • 性能反模式

    我目前正在为一位客户工作石化的由于 性能原因 而更改糟糕的不可测试和不可维护的代码 显然 存在着许多误解 而且不明白原因 只是盲目相信 我遇到的一种反模式是需要标记尽可能多的类内部密封 重新编辑 我看到将所有内容标记为sealed内部 在
  • PHP 函数没有返回值

    由于某种原因 我无法让我的函数返回字符串 password crypt password input password Encrypt Password longer than 8 characters function crypt pas
  • setkeyv 与 data.table 中出现异常错误

    我认为自己非常熟悉data table 但遇到了一个奇怪的错误setkeyv我无法解决的功能 错误非常简单 keycols lt c A B DT lt data table A 1 10 B 91 90 setkeyv DT keycol
  • 是否可以在 HipHop 中使用 PECL 扩展?

    我有一个使用rabbit mq代理的应用程序 我有用php编写的消费者并使用这个扩展http pecl php net package amqp http pecl php net package amqp 我想使用 hiphop 编译这些
  • ios 无法保存plist

    我可以在模拟器中保存 plist 文件 但无法在设备中保存 plist 文件 任何建议 我在用着 NSString dictPath NSBundle mainBundle pathForResource Dictionary ofType
  • 如何为 ASP.NET MVC 站点定义包罗万象的路由?

    我有一个新闻网站 其中的文章按类别标记 我的控制器称为 类别 此 URL http mysite com Category Sport passes Sport采取行动Index在控制器中Category 我想允许以下 URL http m
  • 如何在 JavaScript (React) 项目中使用 Azure Pipeline 变量?

    如何在 React 项目中使用为管道定义的变量 目前 我在 yml 文件中定义了构建变量 如下所示 variables src virtual furnace app dest src build REACT APP VERSION Bui
  • 为所有用户安装 Firefox 扩展 [系统范围安装]

    我编写了一个 Firefox 扩展 它打包为 xpi文件 我想为所有用户安装此扩展 我发现我们可以通过将文件放入Mozilla Extensions文件夹 则该扩展将可供所有用户使用 但问题是安装扩展后 第一次启动 Firefox 时 对于
  • 启动进程“git”返回奇怪的 129 退出代码

    In Bash git status gt dev null echo 0 Powershell 中的相同存储库 gt Start Process git ArgumentList status Wait PassThru ExitCode
  • 存储库模式与简单数据访问层有何不同?

    我对在研究存储库模式期间所读到的内容感到困惑 我想知道人们是否 错误地 使用这个词 当他们只是指数据访问层时 由于在索引中找不到 存储库 设计模式 https rads stackoverflow com amzn click com 02