Questions tagged «repository-pattern»

存储库模式提供了一种在应用程序的数据访问层与业务层之间提供隔离的方法。在实现上使用繁重的问题时使用此标记-标记实现所使用的代码语言。

10
什么是汇总根?
我正在设法弄清楚如何正确使用存储库模式。聚合根的中心概念不断出现。在网络和Stack Overflow上搜索有关总根的帮助时,我一直在寻找有关它们的讨论以及指向应该包含基本定义的页面的无效链接。 在存储库模式的上下文中,什么是聚合根?


10
在PHP中正确的存储库模式设计?
前言:我正在尝试在MVC体系结构和关系数据库中使用存储库模式。 我最近开始用PHP学习TDD,并且意识到我的数据库与我的其余应用程序紧密结合。我已经阅读了有关存储库和使用IoC容器的信息将其“注入”到控制器中的信息。很酷的东西。但是现在有一些关于存储库设计的实际问题。考虑以下示例。 <?php class DbUserRepository implements UserRepositoryInterface { protected $db; public function __construct($db) { $this->db = $db; } public function findAll() { } public function findById($id) { } public function findByName($name) { } public function create($user) { } public function remove($user) { } public function update($user) { } } 问题1:字段过多 …


12
DDD-实体不能直接访问存储库的规则
在领域驱动设计,似乎有很多的协议,任何单位不应该访问存储库直接。 这是来自Eric Evans的“ 域驱动设计”书,还是来自其他地方? 背后的原因哪里有很好的解释? 编辑:澄清:我不是在谈论将数据访问从业务逻辑分离到单独层的经典OO做法-我是在谈论在DDD中实体不应该与数据交谈的特定安排根本没有访问层(即,它们不应保存对存储库对象的引用) 更新:我给了BacceSR赏金,因为他的回答似乎最接近,但是我对此仍然很不了解。如果它是如此重要的原理,那么肯定在某处在线有关于它的好文章吗? 更新:2013年3月,对该问题的投票暗示对此有很多兴趣,尽管有很多答案,但我仍然认为,如果人们对此有想法,还有更多的余地。

3
通用存储库使用EF 4.1有什么意义
当我深入研究DbContext,DbSet和关联的接口时,我想知道为什么您需要围绕这些实现来实现一个单独的“通用”存储库? 看起来DbContext和IDbSet可以满足您的所有需求,并在DbContext中包含“工作单元”。 我是否在这里错过了一些东西,或者似乎人们无缘无故地喜欢添加另一层依赖。

4
遵循存储库模式管理Laravel中的关系
在阅读了T. Otwell关于Laravel良好设计模式的书后,在Laravel 4中创建了一个应用程序时,我发现自己为应用程序中的每个表创建了存储库。 我最终得到以下表结构: 学生:身份证,姓名 课程:id,名称,teacher_id 老师:身份证,姓名 作业:id,名称,course_id 分数(充当学生和作业之间的枢纽):student_id,assignment_id,分数 我具有所有这些表的查找,创建,更新和删除方法的存储库类。每个存储库都有一个与数据库交互的Eloquent模型。关系根据Laravel的文档在模型中定义:http ://laravel.com/docs/eloquent#relationships 。 创建新课程时,我要做的就是在课程库上调用create方法。该课程有作业,因此在创建作业时,我还想在分数表中为该课程中的每个学生创建一个条目。我是通过分配库来完成的。这意味着作业库与两个Eloquent模型(作业和学生模型)进行通信。 我的问题是:由于此应用程序的大小可能会增加,并且会引入更多的关系,因此是与存储库中不同的Eloquent模型进行通信的好习惯还是应该使用其他存储库来代替(我的意思是从Assignment存储库调用其他存储库)还是应该在Eloquent模型中一起完成? 另外,将分数表用作作业和学生之间的枢纽是一种好习惯,还是应该在其他地方完成?


1
Spring Data存储库实际上是如何实现的?
我在项目中使用Spring Data JPA仓库已有一段时间了,我知道以下几点: 在存储库接口中,我们可以添加类似的方法findByCustomerNameAndPhone()(假设customerName和phone是域对象中的字段)。 然后,Spring通过在运行时(在应用程序运行期间)实现上述存储库接口方法来提供实现。 我对它的编码方式很感兴趣,并查看了Spring JPA源代码和API,但是找不到以下问题的答案: 如何在运行时生成方法和生成的存储库实现类以及如何实现和注入方法? Spring Data JPA是否使用CGlib或任何字节码操作库来实现方法并动态注入? 您能否为上述查询提供帮助,并提供任何受支持的文档?

9
不使用存储库模式,请按原样使用(EF)ORM
我一直使用存储库模式,但是对于我的最新项目,我想看看是否可以完美使用它以及实现“工作单元”。我越开始挖掘,就会开始问自己一个问题:“我真的需要吗?” 现在,这一切都从对Stackoverflow的一些评论开始,并追溯到Ayende Rahien在他的博客上的帖子,其中包括2个具体的, 存储库是新的单例 询问没有存储库的阿连德生活,他们值得生活 这可能永远被谈论,并且取决于不同的应用程序。我想知道什么 这种方法是否适合实体框架项目? 使用这种方法是业务逻辑仍在服务层中,还是扩展方法(如下所述,我知道扩展方法是使用NHib会话)? 使用扩展方法很容易做到。干净,简单且可重复使用。 public static IEnumerable GetAll( this ISession instance, Expression<Func<T, bool>> where) where T : class { return instance.QueryOver().Where(where).List(); } 使用这种方法并Ninject作为DI,我是否需要制作Context一个接口并将其注入控制器中?

4
设计良好的查询命令和/或规范
我一直在寻找很多时间来找到典型存储库模式(不断增长的专用查询方法列表等)所提出的问题的好的解决方案。请参阅:http : //ayende.com/blog/3955/repository-是新单人)。 我真的很喜欢使用Command查询的想法,特别是通过使用Specification模式。但是,我的规范问题是它仅涉及简单选择的标准(基本上是where子句),而没有处理其他查询问题,例如联接,分组,子集选择或投影等。基本上,许多查询必须经过所有额外的步骤才能获得正确的数据集。 (请注意:我在“命令”模式中使用“命令”一词,也称为查询对象。我并不是在谈论命令/查询分离,而是在查询和命令之间进行区分(更新,删除,插)) 因此,我正在寻找替代方案来封装整个查询,但仍具有足够的灵活性,以至于您不只是将意粉存储库换成大量的命令类。 我曾经使用过例如Linqspecs,虽然我发现能够为选择条件分配有意义的名称具有一定的价值,但这还远远不够。也许我正在寻找一种结合了多种方法的混合解决方案。 我正在寻找别人可能已开发出的解决方案,以解决此问题或解决其他问题,但仍满足这些要求。在链接的文章中,Ayende建议直接使用nHibernate上下文,但我认为这会使您的业务层大大复杂化,因为它现在还必须包含查询信息。 等待期过后,我将为此提供赏金。因此,请为您的解决方案提供值得的奖励,并提供良好的解释,我将选择最佳的解决方案,并支持亚军。 注意:我正在寻找基于ORM的东西。不必显式使用EF或nHibernate,但是它们是最常见的,并且最适合。如果它可以很容易地适应其他ORM,那将是一个好处。Linq兼容也很好。 更新:我真的很惊讶这里没有很多好的建议。似乎人们要么完全是CQRS,要么完全处于存储库阵营中。我的大多数应用程序都不够复杂,不足以保证CQRS(大多数CQRS倡导者很容易地说,您不应将其用于此)。 更新:这里似乎有些混乱。我不是在寻找新的数据访问技术,而是在业务和数据之间设计合理的接口。 理想情况下,我正在寻找的是查询对象,规范模式和存储库之间的某种交叉。就像我在上面说的那样,规范模式仅处理where子句方面,而不处理查询的其他方面,例如联接,子选择等。存储库处理整个查询,但过一会儿就会失去控制。查询对象还处理整个查询,但是我不想简单地用大量的查询对象代替存储库。

1
方法无法转换为商店表达式
我看到此代码可用于LINQ to SQL,但是当我使用Entity Framework时,它将引发以下错误: LINQ to Entities无法识别方法'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures()'方法,并且该方法无法转换为商店表达式。 存储库代码是这样的: public IQueryable<Models.Estate> GetEstates() { return from e in entity.Estates let AllCommFeat = GetCommunityFeatures() let AllHomeFeat = GetHomeFeatures() select new Models.Estate { EstateId = e.EstateId, AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat), AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat) }; } public IQueryable<Models.CommunityFeatures> GetCommunityFeatures() { return from …

7
如何正确使用存储库模式?
我想知道应该如何对存储库进行分组?就像在asp.net mvc上看到的示例一样,在我的书中,它们基本上每个数据库表都使用一个存储库。但这似乎是很多存储库,导致您以后不得不调用许多存储库以进行模拟和填充。 所以我想我应该将它们分组。但是我不确定如何将它们分组。 现在,我做了一个注册资料库来处理我所有的注册资料。但是,有4个表需要更新,而在我拥有3个存储库之前,需要进行更新。 例如,表之一是许可证表。当他们注册时,我查看他们的密钥并检查它是否存在于数据库中。现在,如果我需要检查该许可证密钥或该表中其他位置(而不是注册)的其他内容,该怎么办? 可以登录一个位置(检查密钥是否未过期)。 那么在这种情况下我该怎么办?再次重写代码(打破DRY)?尝试将这两个存储库放在一起,并希望在其他时间点都不需要使用任何方法(例如,也许我可能有一个检查是否使用了userName的方法-也许我会在其他地方使用该方法)。 另外,如果我将它们合并在一起,那么我将需要2个服务层到同一个存储库,因为我认为拥有站点2个不同部分的所有逻辑将很长,而且我必须具有ValidateLogin(),ValdiateRegistrationForm()之类的名称。 ,ValdiateLoginRetrievePassword()等。 还是仍然调用存储库,只是在周围有一个奇怪的名字? 似乎很难建立一个具有足够通用名称的存储库,以便您可以将其用于应用程序的许多位置并且仍然有意义,我认为在存储库中调用另一个存储库不是一个好习惯吗?

1
存储库模式-如何理解它以及它如何与“复杂”实体一起工作?
我很难理解存储库模式。 关于该主题有很多意见,例如在Repository模式中做得正确,但其他信息,例如Repository是新的Singleton或再次出现,例如在不要使用DAO中使用Repository或只是以某种方式使用Spring JPA Data + Hibernate + MySQL + MAVEN存储库似乎与DAO对象相同。 我厌倦了阅读这些东西,因为恕我直言,这在很多文章中都不是一件难事。 我看到的是这样的:看来我想要的是这样的: ------------------------------------------------------------------------ | Server | ------------------------------------------------------------------------ | | | | Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer | | | | | ------------------------------------------------------------------------ 在Service Layer需要*DTO的对象,并将这些的Repository Layer,基本上不外乎谁知道“的家伙”怎么一个实体可以存储。 例如,假设您具有一些工具的组合(请注意,这只是伪代码) @Entity class ToolSet { @Id public Long …

4
EF包括其他实体(通用存储库模式)
我在Entity Framework Code First之上使用通用存储库模式。一切工作正常,直到我需要在查询中包含更多实体。我必须成功包含一个实体,但是现在我不知道如何包含多个实体。看看到目前为止我得到了什么: public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class { var entityName = GetEntityName<TEntity>(); return _objectContext.CreateQuery<TEntity>(entityName); } public IList<TEntity> GetQueryWithInclude<TEntity>(string toInclude) where TEntity : class { var entityName = GetEntityName<TEntity>(); return _objectContext.CreateQuery<TEntity>(entityName).Include(toInclude).ToList(); } private string GetEntityName<TEntity>() where TEntity : class { return string.Format("{0}.{1}", _objectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name)); } 我试图做但没用的是将字符串数组传递给函数,然后尝试将“包含”附加到查询顶部。我想知道如果我一次调用GetQueryWithInclude并传递一个实体名称(实际上是一个导航属性)来聚合查询结果该怎么办,但是我担心这可能会在每次调用时重复查询结果...您认为什么是使它正常工作的最佳方法? 提前致谢! …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.