2009-06-09 27 views
1

在阅读了关于asp.net mvc的一些教程之后,存储库模式出现了,示例使用了一张表即dinners表。基本上建立的是创建一个接口,然后是一个具体的类,它实现了控制器类中的接口和程序。界面有你典型的粗俗方法。如果您要使用此模式,是否需要创建每种类型的接口?例如有一个带有Dinner类型的GetList方法。如果你有10种不同的类型,你需要执行crud功能?这是否意味着10个具有10个具体类的接口只是为了能够将db技术切换到道路上? 我想弄清楚如何将这种模式应用于标准的3层架构(对象层,业务逻辑层,数据访问层)。需要更深入的存储库模式和依赖注入示例

谢谢。

回答

7

这是我通常在我的实现中执行的方式。

一个通用接口,IEntityRepository定义您的基本CRUD结构。在我实现我定义了以下成员:

  1. 插入
  2. 更新
  3. 删除
  4. 获取
  5. GetPaged
  6. GETALL
  7. 查找(此人使用谓词生成器生成where子句)

我创建了另一个继承IEntityRepository的接口IMyentityRepository。这允许我添加任何特定于实体的成员,并且在需要时仍然可以使用DI。然后创建我的密封类MyentityRepository,继承IMyentityRepository并实现所有成员。

当您使用依赖注入时,您可以为MyentityRepository的具体类型注册接口(IMyentityRepository)。

就我而言,我并没有真正完成。我在存储库之上创建了一个服务层来封装它,并以更一般的方式公开它。例如,假设您想为您的用户创建一个帐户,这可能涉及比创建数据库记录更多的工作。在您的服务中,您将有一个名为CreateUser()的成员,它可能会在其实现中调用多个存储库成员。 我的服务层与我的存储库层相同。我有通用的CRUD成员IEntityService,实体特定成员IMyentityService和MyentityService实现。 MyentityService类将需要一个IMyentityService实例(您可以将其注入到您选择的IoC框架中)您的服务层也可以执行验证和任何业务逻辑。我在控制器中进行验证。好吧,从技术上讲,我调用它我的控制器,然后得到结果,然后我可以写入ModelState。

希望有所帮助。

2

这可能比您要查找的要多一点,但您可以在S#arp Architecture中查看示例Northwind应用程序。

存储库位于Northwind.Core项目中。

另外,使用存储库和DI的好处并非如此,您可以在将来某个日期切换底层数据库技术。相反,您可以编写单元测试,在这些单元测试中,您可以在其所依赖的类的测试中模拟和伪造服务(已由接口定义)。

0

您是否使用可用于任何表的CRUD方法创建通用IRepository类,以及为每个表使用唯一的存储库类。

这是怎样的问题试图决定时,我会问:“如果每一个储存库支持创建,读取,更新和删除”

我选择使用自定义存储库类,以便我的接口更加明确。例如,我有查表数据表,我不允许插入,更新或删除。这些表的存储库仅包含Get方法。这为我提供了一个更清洁的设计,但需要花费更多的工作。

+0

您是否正在创建一个接口,然后为那些只获取存储库的具体类? – TampaRich 2009-06-09 00:52:08