Tag: repository pattern

存储库模式 – 如何理解它,以及它如何与“复杂”实体协同工作?

我很难理解版本库模式。 关于这个话题有很多意见,比如在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 id; @OneToOne […]

存储库模式 – 为什么我们需要接口?

我已经从互联网上读到,我得到了这个说Interfaces是用于这个的点 使用TDD方法 更换持久性引擎 但我无法理解接口将如何有用Replace persistance engine 。 让我们考虑为EmployeeRepository创build一个基本的(没有generics)仓库 public class EmployeeRepository { public employee[] GetAll() { //here I'll return from dbContext or ObjectContex class } } 那么接口如何进入画面呢? 如果我想创build一个接口,为什么使用upcasting? 例如 IEmployee emp = new EmployeeRepository() ; vs EmployeeRepository emp = new EmployeeRepository(); 请详细解释我,还有关于Repository Pattern的其他有用的接口。

工作单位+存储库模式:商业交易概念的下降

Unit of Work和Repository Pattern是当今相当普遍的用法。 正如马丁·福勒( Martin Fowler) 所言 ,使用物UoW的目的是形成一个商业交易,同时UoW知道存储库实际上是如何工作的(持续的无知)。 我已经回顾了许多实现; 并忽略具体的细节(具体/抽象类,接口……),它们或多或less类似于下面的内容: public class RepositoryBase<T> { private UoW _uow; public RepositoryBase(UoW uow) // injecting UoW instance via constructor { _uow = uow; } public void Add(T entity) { // Add logic here } // +other CRUD methods } public class UoW { // Holding one repository […]

精心devise的查询命令和/或规格

我一直在寻找一个很好的解决scheme来解决典型的Repository模式(针对特定查询的不断增长的方法列表,请参阅http://ayende.com/blog/3955/repository-是新的单身人士 )。 我非常喜欢使用Command查询的想法,特别是通过使用Specification模式。 然而,我的规范问题是它只涉及到简单select的标准(基本上是where子句),并没有处理查询的其他问题,如连接,分组,子集select或投影等。基本上,所有额外的许多查询必须经过以获得正确的数据集。 (注意:我在命令模式中使用了“命令”这个术语,也称为查询对象。我不是在命令/查询分离中讨论命令,在查询和命令之间有区别(更新,删除,插)) 所以我正在寻找封装整个查询的替代scheme,但是仍然足够灵活,以至于您不只是换取意大利面条仓库来获取命令类的爆炸式增长。 我已经使用了Linqspecs,虽然我发现能够为select标准分配有意义的名称是有价值的,但这还不够。 也许我正在寻求结合了多种方法的混合解决scheme。 我正在寻找其他人可能已经开发的解决这个问题的解决scheme,或者解决不同的问题,但是仍然满足这些要求。 在链接的文章中,Ayendebuild议直接使用nHibernate上下文,但是我觉得这在很大程度上使业务层复杂化,因为它现在还必须包含查询信息。 等待一段时间后,我会提供一个赏金。 所以,请让您的解决scheme赏金值得,好的解释,我会select最好的解决scheme,并upvote亚军。 注:我正在寻找一些基于ORM的东西。 显然不一定是EF或nHibernate,但这些是最常见的,并且最适合。 如果它可以很容易地适应其他ORM的,这将是一个奖金。 Linq兼容也不错。 更新:我真的很惊讶,这里没有很多好的build议。 看起来好像人们完全是CQRS,或者他们完全在版本库里。 我的大多数应用程序都不够复杂,不能保证CQRS(大多数CQRS提倡者都表示不应该使用它)。 更新:这里似乎有点混乱。 我不是在寻找新的数据访问技术,而是在业务和数据之间devise合理的界面。 理想情况下,我正在寻找的是查询对象,规范模式和存储库之间的某种交叉。 正如我上面所说,规范模式只处理where子句方面,而不是查询的其他方面,如连接,子select等。存储库处理整个查询,但一段时间后失控。 查询对象也处理整个查询,但我不想简单地用查询对象的爆炸replace存储库。

如何正确使用存储库模式?

我想知道我应该如何分组我的仓库? 就像我在asp.net mvc和我的书中看到的例子,他们基本上每个数据库表使用一个存储库。 但是,这看起来像很多的知识库,导致你不得不在稍后调用许多存储库进行嘲弄和调整。 所以我猜我应该把他们分组。 但是我不知道如何分组。 现在我做了一个注册库来处理我所有的注册内容。 不过,我需要更新4个表格,之前我有3个库来做到这一点。 例如,其中一个表是许可证表。 当他们注册我看他们的密钥,并检查它,看看是否存在数据库中。 现在如果我需要检查这个许可证密钥或其他地方的其他地方,然后registry中的其他东西,会发生什么? 一个地方可以login(检查密钥是否没有过期)。 那么在这种情况下我会做什么? 重写代码(中断DRY)? 尝试将这两个存储库一起处理,并希望在其他某个时间点不需要任何方法(例如,也许我可能有一个方法来检查用户名是否被使用 – 也许我需要在别的地方)。 另外如果我把它们合并在一起,我会需要2个服务层去同一个存储库,因为我认为有一个网站的2个不同部分的所有逻辑将是漫长的,我必须有像ValidateLogin(),ValdiateRegistrationForm() ,ValdiateLoginRetrievePassword()等。 或者调用Repository,只是有一个怪异的名称? 创build一个具有足够通用名称的存储库似乎很难,因此您可以将其用于应用程序的许多位置,并且仍然有意义,我不认为在存储库中调用另一个存储库会是一个好的做法吗?

DDD – 实体无法直接访问存储库的规则

在域驱动devise中,似乎有很多 协议 ,实体不应该直接访问存储库。 这是Eric Evans 领域驱动devise书籍,还是来自其他地方? 它背后的理由在哪里有一些很好的解释? 编辑:澄清:我不是在谈论经典的OO实践,将数据访问从业务逻辑分离到一个单独的层 – 我正在谈论的具体安排,在DDD中,实体不应该与数据交谈访问层(即它们不应该保存对Repository对象的引用) 更新:我给了BacceSR赏金,因为他的答案看起来最接近,但我对这件事还是很了解。 如果这样一个重要的原则,应该有一些关于它在网上的好文章,当然? 更新:2013年3月,关于这个问题的提问意味着对此有很多兴趣,即使有很多答案,我仍然认为如果人们有这个想法,还有更多的空间。

DAO和Repository模式有什么区别?

数据访问对象(DAO)和存储库模式有什么区别? 我正在开发一个使用Enterprise Java Bean(EJB3),Hibernate ORM作为基础结构的应用程序,以及作为devise技术的领域驱动devise(DDD)和testing驱动开发(TDD)。

存储库和服务层之间的区别?

在OOPdevise模式中,存储库模式和服务层之间有什么区别? 我正在研究一个ASP.NET MVC 3应用程序,并试图了解这些devise模式,但我的大脑只是没有得到它…但!

EF包括其他实体(通用存储库模式)

我在entity framework代码优先使用通用存储库模式。 一切工作正常,直到我需要在查询中包含更多的实体。 我成功地包含了一个实体,但现在我不知道如何包含多个实体。 看看我到目前为止: 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)); } 我试图做的,但没有工作是传递一个string数组到一个函数,然后尝试“追加”查询顶部的包括。 我想知道如果我调用GetQueryWithInclude,并一次传递一个实体名称(实际上是一个导航属性)来聚合查询的结果,但我担心这可能会重复每个调用的查询结果…你认为最好的方法是什么? 提前致谢! 更新: 这是我想要实现的一个例子: public […]

entity framework4 CTP 4 / CTP 5通用存储库模式和单元可testing

我正在玩最新的entity frameworkCTP 5版本,并build立一个简单的asp.net MVC博客,我只有两个表:发表和评论。 这完全在POCO中完成,我只需要DbContext部分的帮助,我需要它是unit testing(使用IDbSet?),我需要一个简单/通用的存储库模式来添加,更新,删除,检索。 任何帮助表示赞赏。 谢谢。