问题标签 [repository-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10982 浏览

domain-driven-design - 存储库模式:如何延迟加载?或者,我应该拆分这个聚合吗?

我有一个具有编辑器和项目概念的域模型。

一个Editor拥有多个Projects,一个Project不仅有一个Editor owner,还有多个Editor members。因此,一个编辑器也有许多“加入”的项目。

我正在采用 DDD 方法对此进行建模并使用存储库模式进行持久化。但是,我对模式的理解还不够好,无法确定我应该如何做到这一点。

我正在假设 Editor 和 Project 可能在同一个聚合中,根是 Editor。因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑器。

但是,如果我只被允许从我的存储库中检索编辑器,这是否意味着当我获得拥有它们的编辑器时,我必须从存储库中加载所有项目?如果我想延迟加载成员编辑器,项目是否也需要对存储库的引用?

或者,如果我拆分聚合并拥有一个编辑器存储库和一个项目存储库,我应该如何处理两者之间的事务,例如将新项目添加到编辑器时?例如:

我是否误解了存储库模式的意图?

0 投票
3 回答
16021 浏览

.net - LINQ to SQL 和存储库模式

我觉得我在绕圈子跑。对于使用LINQ to SQL的正确存储库模式,我似乎无法下定决心。如果您熟悉Rob Conery 的 MVC Storefront,您会看到他的实现用另一个类包装了 LINQ 生成的模型,并将 LINQ 生成的模型简单地视为数据传输对象(DTO)。它看起来像这样:

这样做的好处是什么(使用包装类),而不是 Mike Hadlow在他的 IRepository<T> 版本中使用带有 LINQ to SQL 的 IRepository 模式建议的方式,他只是从存储库?

应该在哪里执行和检查业务逻辑?这是在保存/更新时由存储库调用的单独层中,还是内置到包装器类中?

0 投票
3 回答
945 浏览

asp.net - IRepository 对返回对象的混淆

我有一些我经常使用的电子商务代码,它使用 Linq To SQL 将订单保存到数据库。我想删除紧密耦合的 Linq to SQL 位并传入一个 IRepository 但我对事情仍然有些困惑。

假设我的 ICustomerRepository 上有一个 GetCustomer() 方法,该方法返回一个 Customer 对象。

我是否需要它来真正返回一个从该方法传回的 ICustomer 对象,所以如果我从 Linq To SQL 切换到说 SubSonic 这不是问题?

我相信我会这样做,如果是这样的话,Linq To SQL 中是否有一种方法可以轻松地将我的 Linq To SQL Customer 对象转换为我的 ICustomer 对象,例如 SubSonics ExecuteSingle(Of ) 方法?

0 投票
1 回答
488 浏览

c# - 使用 SQL 后端时的存储库模式和项目删除

所以假设我有一个名为 Post 的类,其中包含一个 IList

我发现当我要求我的存储库更新我的帖子时,将评论添加到列表中很容易,它可以查看哪些评论是新的,并将所需的信息发送到我的数据层,但是当评论被删除时呢? ? 你怎么处理这个?

你会拉回一个评论列表来检查哪些评论不再存在于当前更改的集合中吗?

或者连接事件来跟踪它?

还是完全不同的东西?

只是为了获取更多信息,我在 C# 中执行此操作并且不能使用 O/R 映射器。我必须使用存储过程来检索数据集并手动映射我的对象。我可能对存储库模式的理解是错误的,但我使用它来调解数据层,从请求数据、添加数据等,它将我的数据集数据映射到对象并返回对象。因此,如果您愿意,也可以随意详细说明如何使用存储库模式。

0 投票
7 回答
22954 浏览

design-patterns - 存储库模式中的事务

如何使用存储库模式以事务方式封装多个实体的保存?例如,如果我想添加一个订单并根据该订单创建更新客户状态,但只有在订单成功完成后才这样做?请记住,对于此示例,订单不是客户内部的集合。他们是他们自己的实体。

这只是一个人为的例子,所以我并不关心订单是否应该或不应该在客户对象内,甚至在同一个有界上下文中。我并不真正关心将使用什么底层技术(nHibernate、EF、ADO.Net、Linq 等)。我只想看看在这个公认的人为设计的全有或全无操作示例中某些调用代码可能是什么样子。

0 投票
1 回答
1472 浏览

model-view-controller - 存储库模式:什么是“合适的大小”?

我正在为 MVC 应用程序构建一些存储库,并且我正在尝试提出在存储库之间划分职责的正确方法。在大多数情况下,这是显而易见的。但是有一种特殊情况,我不确定正确的答案是什么。

此应用程序的用户需要为其员工跟踪多种类型的时间。为简单起见,我们只考虑两个。我称它们为“考勤卡”和“考勤”。这两者之间差异的确切性质并不重要,但您应该注意最终用户将它们视为完全独立的数据。不过,我认为,他们认为它们完全独立的数据的原因是他们过去从未真正有机会看到它们在一起。这两种类型的记录在编辑记录方面具有几乎完全不同的业务规则,但一般来说,它们也是员工在特定时间所处位置的两种记录。这两种时间记录有很多共同的属性,比如总小时数,以及为其收集时间的员工。这两种类型还具有一些完全独特的单个类型的属性。我们将这些“额外”属性保存在另一种类型的实例中。所以一般的结构是这样的:

所以问题是,这里需要多少个存储库?

1 个存储库

只有一个存储库的设计将公开返回“时间卡”、“出勤”记录或在一个列表中返回两种类型的方法。这对于存储库的客户来说相当方便,但在我看来,它有成为一个非常胖的类的真正危险。我认为仅用于“考勤卡”的存储库已经成为系统中最大的存储库之一,即使由于涉及复杂的业务规则而无需处理“出勤”。

2 存储库

另一种设计将有一个“考勤卡”存储库和另一个“考勤”记录存储库。这样做的好处是,例如“考勤卡”的业务规则本身就在一个地方。但我也想有一种方法来获取所有时间记录的列表,无论类型如何。目前尚不清楚在这种情况下使用哪个存储库。两个都?

3 存储库

具有一个用于“时间卡”的存储库、另一个用于“出勤”记录的存储库以及提供所有时间记录的只读列表的第三个存储库的设计也是可能的。与 2 存储库设计一样,这具有优势,例如,“时间卡”的业务规则位于一个位置。现在很清楚从何处获取组合列表。但是我发现我可以从两个不同的存储库中获得相同的记录有点奇怪。

杂交种

混合方法将使用单个存储库,但将任何业务规则代码(包括记录选择)移动到单独的类型中。在此示例中,单个“时间记录存储库”将聚合“时间卡”和“出勤”时间的业务规则实现类的实例。我认为这是我现在喜欢的方法。

其他?

我错过了什么?一种设计优于另一种设计有什么令人信服的论据吗?

0 投票
2 回答
1169 浏览

linq-to-sql - 存储库、实体对象和域对象

在我的存储库中,我正在从 Linq 实体查询对我的域对象进行分配。然后我有一个服务层来处理从存储库返回的这些对象。

我的域对象应该像这样在存储库中吗?或者我的存储库是否应该仅限于实体和数据访问,而是让我的服务层对域对象进行分配?

在存储库中完成所有分配似乎更容易,但现在我的数据库和域对象之间的区别并不明显。这里的正确做法是什么?蒂亚

0 投票
2 回答
1215 浏览

domain-driven-design - 可以将 Datacontext 设置为存储库中的属性吗?

将 datacontext 设置为这样的属性是否有任何潜在问题:

存储库

服务层:

0 投票
2 回答
491 浏览

encryption - 数据加密是否属于存储库模式?

我正在使用应用程序级加密来保护敏感数据。我需要在将字段存储到物理数据库之前对其进行加密,并且在将其显示在用户界面上之前我需要对其进行解密。

我在应用程序中应用存储库模式。

数据加解密代码是属于 Repository 类内部还是外部?

我目前的想法是,当数据处于静止状态时,加密是存储库的一个方面,使用存储库的服务类不应与此加密代码混淆。

服务类负责验证和业务逻辑,但加密算法和静态数据存储方式取决于存储库实现。

这是一种合理的做法还是我错过了什么?

0 投票
5 回答
1354 浏览

sql - 即席数据和存储库模式

从不适合任何模型实体或扩展某些模型实体的存储库返回临时(逐案自定义)数据的推荐方法是什么?

101 的例子是无处不在的 hello word 应用程序:一个博客系统。假设您要加载一个帖子列表,其中帖子条目包含一些 Post 实体中不存在的附加信息。假设它是评论的数量以及最后评论的日期和时间。如果使用普通的旧 SQL 并直接从数据库中读取数据,这将是非常微不足道的。如果我负担不起为每个帖子加载整个评论集合,并且我想在一次数据库命中中完成,我应该如何使用存储库模式以最佳方式完成它?这种情况有没有常用的模式?现在假设您有一个中等复杂的 Web 应用程序,其中每个页面需要稍微不同的自定义数据,并且无法加载完整的层次结构(性能、内存要求等)。

一些随机的想法:

  1. 向可以由自定义数据填充的每个模型添加一个属性列表。

  2. 逐个子类模型实体,并为每个子类创建自定义阅读器。

  3. 使用 LINQ、编写即席查询和读取匿名类。

注:我最近也问过一个类似的问题,不过好像太笼统了,没有引起太多关注。

例子:

根据以下答案中的建议,我添加了一个更具体的示例。这是我试图描述的情况:

如果我不做任何额外的事情并使用现成的 ORM,这将导致 n+1 个查询或可能一个查询加载所有帖子和评论。但最佳情况下,我希望能够只执行一个 SQL,该 SQL 将为每个帖子返回一行,包括帖子标题、正文等以及评论计数和最近的评论日期。这在 SQL 中是微不足道的。问题是我的存储库将无法读取此类数据并将其放入模型中。最大日期和计数在哪里?

我不是在问如何做到这一点。您总是可以以某种方式做到这一点:向存储库添加额外的方法,添加新类,特殊实体,使用 LINQ 等,但我想我的问题如下。为什么存储库模式和正确的模型驱动开发如此广泛接受,但它们似乎并没有解决这种看似非常普遍和基本的情况。