IRepository模式

时间:2012-03-02 14:45:42

标签: c# .net web-services

出于某种原因,你总是让生活中的人知道但不喜欢解释它们 - 所以我来到这里希望能够了解IRepository模式是什么。

我有大约1年的编程经验,并希望有人向像我这样的新手清楚解释上述模式是如何工作的。

我收到了来自多个来源的混合消息,我现在开始迷惑*%& ^ $。但是,我注意到的是,通常在提及IRepository模式时,还会提到其他熟悉的术语,例如域,域对象,域模型,应用程序服务,域服务,Web服务 ..

任何人都可以给出一个解释(不是重要的,但足以让每个组件的含义足够好)...请分享你的经验!

5 个答案:

答案 0 :(得分:6)

存储库模式通常作为domain driven design(DDD)的一部分进行讨论。

以下内容过于简化以达到目的。

DDD是一种用于构建应用程序的体系结构。在其中,开发人员将定义模仿业务需求的模型。例如,如果您正在构建电子商务应用程序,那么您将拥有产品模型和购物车模型(以及其他内容)。

在此体系结构中,存储库负责持久化和检索模型。在我们网站的访问者将产品添加到他/她的购物车后,我们会构建购物车对象var cart = new Cart(sessionId, productId, yada...),然后拨打repository.Save(cart)

回答你的问题:

IRepository和更可能的IRepository<T>接口用于简化您的存储库。它们通常包含Get(int id)Save(object o)等方法,无论您是保存产品还是购物车,都不会改变(请记住,所有信息都在模型中)。在这种类型的应用程序中,您将使用一个存储库来处理所有持久性,并仅为特定用途创建专门的存储库(例如CartRepository)。

DDD的另一部分是应用程序不关心模型的持久性,只是它们是持久的。通过创建接口,可以将应用程序配置为将对象持久保存到任何地方,而无需更改代码。在我们的示例应用程序中,我们可以SQLServerRepositoryOracleRepositoryXmlRepositoryMongoRepository。只要他们实现了IRepository接口,我们的购物车就能够将对象保存(保存)到各种数据库或XML文件中。

答案 1 :(得分:0)

看看这里,有关存储库,域等的最佳解释...... http://en.wikipedia.org/wiki/Domain-driven_design http://domaindrivendesign.org http://www.infoq.com/minibooks/domain-driven-design-quickly

答案 2 :(得分:0)

理解上述术语的关键是Domain Driven Design。有一本好书Domain Driven Design by Eric Evans。领域驱动设计不是标准,不是技术或方法。它是软件开发中的一套实践。如果你将保留这些做法,你将获得一些好处。优点不在于缩短开发时间,不在于使用某些工具,而在于代码的可维护性,可测试性等。 模型是来自现实世界的一些事物的代表。您的目标是保持模型清洁,不允许影响编程技术,数据存储限制。在这种情况下,使用Repository模式非常重要。

答案 3 :(得分:0)

让我举一个简短的例子,说明我如何使用IReporisotry模式。不要把这个解释当作“使用它的方式”,这只是一个例子。

我有一个Silverlight应用程序,它使用服务器端的EntityFramework来访问数据库。我不知道您是否熟悉EntityFramework,但在其他功能中,它为您提供了context您的实体,因此您可以向上下文询问权限,或者告诉上下文将实体保存到数据库中。

该上下文有许多存储库来处理这些权限。所以我的应用程序有一个SQLReporsitory(实现我的IRepository)'知道'如何将实体保存到数据库。那么为什么我实施了IRepository呢?因为我还需要测试保存和检索我的实体,我不能依赖数据库中的数据。所以我创建了一个“内存数据库”,它拥有简单的List<T>个实体,并且知道如何从这些列表中添加,检索和删除实体。

因此,当我运行应用程序时,会创建SqlRepository,当我运行测试时,会创建Fake Repository。而我的业务核心根本没有改变。我只是'问'一个实体或其他什么,根据我正在运行的上下文,我从数据库或我的内存数据库中获取数据。

希望有所帮助

编辑:这是一个很好的例子,带代码! http://azurecoding.net/blogs/brownie/archive/2010/09/22/irepository-lt-t-gt-and-iunitofwork.aspx

答案 4 :(得分:-1)

简而言之,IRepository是反模式 - &gt; http://codebetter.com/gregyoung/2009/01/16/ddd-the-generic-repository/

在C#/ .net land中,有一个很好的驱动程序过度复杂/过度设计,即使最简单的CRUD应用程序必须是DDD并且具有域模型和offcourse(错误地)具有通用存储库。最好的货物崇拜编程

您可以找到一个很好的资源来评论过度设计的架构@ http://ayende.com/blog/tags/reviews