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

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编写的类爬虫抛出属性错误

    用 python 编写一些代码后 我陷入了深深的麻烦 我是按照 Python 中的 OOP 设计编写代码的新手 我在代码中使用的 xpath 是完美的 当通过 page crawler 类的实例运行 info grabber 类中的 pas
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 将状态上下文作为附加方法参数嵌入到状态中有何优缺点?

    在设计模式的背景下state 嵌入的优点和缺点是什么StateContext作为附加方法参数State 为了更清楚地说明 public void handle Object obj vs public void handle StateCo
  • 组织 jQuery/JavaScript 代码的最佳方式 (2013) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 问题 这个答案之前已经回答过 但已经
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • 如何在两个类之间共享数据

    Question 有没有一种方法可以让两个类同时相互继承 背景 我目前正在开发一个 Socket Server 项目 在这个项目中 我有两个课程 一个Server类 以及一个GUI班级 他们的目的是不言自明的 但是 我显然需要让两个班级相互
  • Objective-C 继承中@synthesize/@property 的使用

    如果您有一个带有实例变量 foo 的类 A 该类具有 property synthesize 指令 并且类 B 继承自类 A 那么它是否还需要 property synthesize foo 我问的原因是因为当我尝试使用 B 类的 foo
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta
  • 我应该使用课程吗? (Python)

    我正在尝试编写一个包含一些数学函数的小型 Python 模块 例如 它可能包含如下函数 def quad x a b c return a x 2 b x c 您可能会注意到它包含几个参数 即a b c 除了变量x 现在 如果我将其放入文件
  • 访客模式如何不违反开放/封闭原则?

    来自维基百科 这个想法是 一旦完成 类的实现只能修改为 纠正错误 新的或更改的功能将需要创建不同的类 该类可以通过继承重用原始类的代码 据我了解 访问者模式是一种强大的技术 可以通过使用双重分派来遍历实现相同接口的相似但不同的对象 在我的一
  • 如何在没有接口的情况下模拟多重继承?

    如何在不使用接口的情况下在 C 中模拟多重继承 我确实相信 接口能力不适用于此任务 我正在寻找更多面向 设计模式 的方式 就像 Marcus 所说 使用接口 扩展方法来制作像 mixins 这样的东西可能是你目前最好的选择 另请参阅 使用接
  • 在perl中调用基本构造函数

    从 Perl 中的类构造函数调用基本构造函数的正确方法是什么 我见过这样的语法 my class shift my a shift my b shift my self class gt SUPER new a b return self
  • 我们可以实例化一个抽象类吗?

    在一次采访中 有人问我 我们是否可以实例化一个抽象类 我的回答是 不 我们不能 但是 面试官告诉我 错了 我们可以 我对此争论了一下 然后他告诉我自己在家尝试一下 abstract class my public void mymethod
  • 如何在不使用 viewWillDisappear 的情况下使 NSTimer 无效/取消初始化?

    var faderTimer NSTimer override func viewDidLoad super viewDidLoad self faderTimer NSTimer scheduledTimerWithTimeInterva
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 在 PHP 应用程序中实现插件的设计模式

    对于如何在 PHP 应用程序中实现插件有共识吗 我已经调查过观察者模式 http devzone zend com 1732 implementing the observer pattern with splobserver and sp
  • 依赖注入容器什么时候会变得太大,我该怎么办?

    我们都知道为什么依赖注入很棒因为它使代码耦合更少 更容易测试 并且更容易阅读 然后有些人决定使用依赖注入容器 like pimple http pimple sensiolabs org PHP 可以协助依赖倒置 http en wikip
  • 开闭原则背后的含义和推理是什么?

    开放 封闭原则规定软件实体 类 模块等 应该对扩展开放 但对修改关闭 这意味着什么 为什么它是良好的面向对象设计的重要原则 这意味着您应该将新代码放入新的类 模块中 现有代码应仅针对错误修复进行修改 新类可以通过继承重用现有代码 开放 封闭

随机推荐

  • 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