问题标签 [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 投票
2 回答
1216 浏览

nunit - MOQ 问题 - 模拟类返回不正确的数据

所以,我使用最小起订量进行测试,但我遇到了一个问题,阻止我正确地模拟,至少我是这么认为的。这是我的存储库类:

这是实现之一(假的):

这是一个控制器定义,可以完美地与真实页面和真实网页中的假数据或 sql 数据 (IoC) 配合使用:

这是起订量方法:

它适用于列表分页的这种实现:

但使用它时失败:

无需更改测试并仅更改 List 实现(仅在 .Accounts 上进行分页),一切正常,但是当我尝试使用 AccountsPaged 方法时,它无法返回任何元素。在实际使用中,在网页上,它可以双向工作。

请指教,谢谢。

编辑:如果我这样做:

我退回了 5 件物品而不是 2 件。

0 投票
2 回答
677 浏览

asp.net-mvc - 在 MVC 中在哪里实例化数据上下文(适配器、连接、会话等)?

我们正在构建一个 ASP.NET MVC 站点,我正在努力在哪里定义一个连接以最好地启用单元测试(我一般使用“连接” - 它可以是会话、连接、适配器或任何其他类型可以管理事务和数据库操作的数据上下文)。

假设我们有 3 个类:

过去,我们会在 UserService 的方法中做这样的事情:

但是,由于没有注入对 SomeSession 的依赖,因此实际上不可能对此进行单元测试。但是,如果我们使用 DI 将依赖项注入到 UserService 中,则会话会在 UserService 的生命周期内挂起。如果有多个从 UserController 调用的服务,则每个服务都可能有会话,直到 UserController 被垃圾回收。

关于如何更好地管理这个的任何想法?我错过了一些明显的东西吗?

编辑

抱歉,如果我不清楚 - 我知道我可以将依赖注入与会话/数据上下文一起使用,但是它会在服务类的生命周期内得到维护。对于任何运行时间较长的操作/方法(例如,假设服务被批处理调用),除了增加可测试性之外,这可能会导致很多打开的会话。

0 投票
2 回答
750 浏览

.net - Linq2Sql - 你如何延迟加载嵌套列表?

如何在不实际执行查询的情况下延迟加载嵌套列表?使用一个非常基本的示例,假设我有:

然后在我的存储库层中,我有以下方法:

然后在服务层中,我将使用 GetCityBlocksByOwner,在这里我使用扩展方法来获取特定人拥有的城市街区,比如我们只想要 Guido 的街区:

如果我们在存储库中执行 .ToList() ,它将执行查询 - 这将是荒谬的,因为我们不知道我们在那个级别获得了谁的块。所以问题是,我们如何有效地做到这一点?

假设有 50000 个街区所有者,以及大约 1000000 个城市街区,加载所有这些街区不是一种选择。由于嵌套,使用 IQueryables 将不起作用(至少我知道没有极端的黑客攻击)。另外,如果我尝试使用 Rob Conery 的 LazyList 之类的东西,那么我们的 DAL 基本上会泄漏到我们的域模型中,这在未来可能会非常非常糟糕。

那么我该如何正确地做到这一点呢?

  • 这是确定正确上下文的问题吗?如果是这样,我们会在存储层或服务层中这样做吗?
  • 我是否将服务层和存储库层半融合在一起以获得非常具体的服务方法?
  • 还是我完全错过了什么?(对于 Linq2Sql 来说还是比较新的东西,反正它正在被逐步淘汰,所以......)

编辑: 在存储库模式中,我们当前正在映射到我们的域对象,所以它看起来像这样:

为此,我们必须让建筑物获得 .ToList(),除非我们将 CityBlock 对象中的实际字段设置为 IQueryable - 这似乎不对,因为看起来好像有太多的权力授予访问 CityBlock.BuildingsOnBlock 字段的任何人。这个映射到我们的领域对象是我们应该在服务层做的吗?

0 投票
2 回答
3538 浏览

nhibernate - 使用 nHibernate 和存储库模式,需要一些指导

好的,所以我刚刚进入休眠状态(使用流利的)。

我喜欢它的一件事是我可以使用存储库模式(从 nhibernate rhino 博客中了解它)。

基本上使用泛型,我可以创建适用于我所有数据库表的方法。

然后我继承 Repository 类,然后我可以添加特定于该实体的方法。

在尝试添加更新方法时,有人提到存储库模式应该作用于集合?我在这里看东西不正确吗?为什么我不能创建更新方法?

我尝试添加更新方法,但我对如何处理会话和更新数据库感到困惑?

我希望每个实体的所有数据库访问都在一个地方,因此 UserRepository 将拥有所有基本的 CRUD,然后可能还有其他一些方法,如 GetUserByEmail() 等。

0 投票
3 回答
1318 浏览

design-patterns - 什么属于存储库,什么不属于?

在实现存储库模式的 ASP.NET MVC 应用程序中,我很好奇如果它们仍然与给定存储库的一般焦点相关,是否适合将非数据相关方法放置在存储库中。例如,假设 ProductsRepository 具有添加和删除 ProductImages 的方法,这些方法在数据库和本地文件存储中也有部分表示。如果需要删除 ProductImage,我们需要使用存储库方法从数据库中删除一行,并且我们还需要从存储介质中删除与该图像关联的文件。IO 操作是否属于存储库,还是有更合适的位置?

在刚刚描述的情况下,我一直在做的一件事是在我的存储库中提供静态方法,这些方法通过使用存储在数据库中的文件名和预定义的目录模式以编程方式生成它,为我提供了给定 ProductImage 的路径. 这超出了存储库的预期用途吗?


编辑

如果这样的操作不属于存储库,那么类似的东西在 MVC 模式中应该放在哪里?在我看来,在 Controller 和 Repository 之间有另一个层可能是有意义的,它根据需要调用 Repository 并且可以从 Controller 静态调用。

0 投票
1 回答
207 浏览

linq - 使用 IQueryables 缓存策略

我一直在思考如何最好地缓存 IQueryables。我正在使用存储库模式将数据提取到诸如此类的类中:

现在我将如何最好地缓存这个对象?我想保持可查询的延迟执行,因为实际上除了 Category 之外还有更多可以链接到该项目的东西,我最好不要将它们获取到存储在对象上,因为对象可能会变得太大,或者它们可能需要单独缓存。

我在想编译查询可以以某种方式使这成为可能,我只是不太明白如何。有没有人找到任何好的解决方案?这似乎是一种非常常见的使用模式。

0 投票
1 回答
358 浏览

c# - Generic Repository Linq2Sql 阻抗不匹配问题

我正在研究 API 如下所示的存储库模式:

其中visitor是一个域对象,x代表这个域对象。存储库上 Find 方法的方法签名是:

这一切都很棒,直到我尝试将它与 Linq2Sql 一起使用,因为 linq2sql 创建了自己的对象,因此当我想调用时:

存在类型不匹配,因为 linq2sql 需要它创建的类型的函数,而不是我传入的函数。

0 投票
4 回答
1319 浏览

c# - DTO(linq2sql)和类对象之间的混淆!

我已经成功使用 linq2sql 和 linq DTO(由 linq2sql 创建的类)......

我很困惑,我有更新旧应用程序的任务,我可以看到我的 DTO 将按应有的方式使用.... 传输日期

我正在使用存储库模式,所以我通过 linq2sql dtos 将数据从存储库传递到服务......一旦我进入服务层(这基本上是我的业务逻辑),那么我需要传递类对象......

这些类对象基本上是 dtos 的镜像(或多或少) - 在某些地方有一些变化,但通常是相同的..

所以回到手头的问题!- 仅使用 dtos 将数据从存储库传输到服务层是这种好习惯吗……一旦进入服务层(业务逻辑),我应该将所有 dtos 映射到类对象计数器部件(当然使用自动映射器! !)

我的另一种选择是继续使用类对象之类的 DTOS,并将它们从方法传递到方法以及作为返回类型等,但我觉得这是不好的做法,我一直在想我应该应用哪种方法?

任何帮助都非常感谢

谢谢

0 投票
4 回答
4098 浏览

c# - LINQ to SQL 插入失败

尝试使用 LINQ to SQL 插入新记录时,我遇到了一个非常令人沮丧的问题。如果我单步执行此代码,有时它会插入新记录,但大多数时候不会。当它失败时,我看到以下错误。

无法将值 NULL 插入到列“名称”、表“设备制造商”中;列不允许空值。插入失败。该语句已终止。

此错误抱怨“名称”字段为空,但事实并非如此。当我调试并单步执行此集合时,["Name"] 具有我在表单中输入的值。

这是表创建语句。

这是我试图添加新记录的 ASP.NET MVC 控制器和创建操作。

这是 Create.aspx 视图。

这是我正在使用的存储库实现。

0 投票
3 回答
9489 浏览

asp.net - 存储库模式最佳实践

所以我在一个应用程序中实现存储库模式,在我对模式的理解中遇到了两个“问题”:

  1. 查询 - 我已经阅读了使用存储库时不应使用 IQueryable 的响应。但是,很明显,您希望在每次调用方法时都不会返回完整的对象列表。是否应该实施?如果我有一个名为 List 的 IEnumerable 方法,那么 IQueryable 的一般“最佳实践”是什么?它应该/不应该有哪些参数?

  2. 标量值 - 返回单个标量值而不必返回整个记录的最佳方式是什么(使用存储库模式)?从性能的角度来看,在整行上只返回一个标量值不是更有效吗?