【发布时间】:2011-01-05 05:12:15
【问题描述】:
首先,对于下面对我的大脑空间的冗长描述,我们深表歉意。我仍然在思考许多这些新想法,所以我确定我描述的东西不正确。请随时纠正我的错误。
我们正处于一个新的 ASP.net MVC2 站点的研发阶段,并希望确保我们能够 1) 将我们的数据存储与我们的应用程序分离,2) 允许我们的应用程序通过单元测试进行测试,以及 3) 允许我们要更改我们的数据存储或使用 Linq2SQL 以外的其他东西。
这个看似简单的目标为我打开了一个全新的世界,其中包括存储库模式、IoC、DI 以及其他各种让我头疼的东西。以下是目前关注的焦点,或者至少我认为是实现我们目标的一些正确的计划:
我们将拥有许多 ISpecificRepository 接口,用于定义接口用户与基础数据存储之间的契约。
SpecificRepository 实现将查询特定的数据存储并返回代表我们的域对象(或它们的集合)的 POCO。
-
我们的服务层将使用传递给各种服务方法的 ISpecificRepository 实例执行应用程序特定的业务逻辑,并将这些 POCO 域对象传递回我们的表示层。
如前所述,我们计划使用 Linq2SQL 为应用程序实现我们的特定存储库,并决定通过为我们的域对象创建 POCO 并创建与这些对象之间的映射到LINQ 生成的实体。在服务层中,我们可以创建业务逻辑来查询存储库、添加数据以及为每个用例执行我们需要执行的任何其他操作。这看起来不错,但我担心的是,由于我们使用的是 Linq2SQL,我们的特定 Linq 存储库实现现在必须容纳服务层有效实现业务逻辑所需的所有许多 Get 查询。
我很好奇这是否会以某种方式破坏存储库模式,因为我们现在不是在服务层而是在存储库中容纳特定于应用程序的逻辑。
我觉得我们需要这样做的原因是,我可以使用各种 DataLoadOptions 等在我的特定 Linq 存储库上编写更有效的 Linq 查询,而无需将 IQueryable 从我的存储库返回到我的服务层,它似乎这种逻辑实际上属于。此外,我看到的所有示例 IRepository 接口似乎都非常轻量级,并且只提供了一些方法来获取底层数据存储的 GetByID、GetAll、Find、Insert、Delete 和 SubmitChanges。就我而言,听起来我的特定存储库会做更多的事情。
感谢您阅读本文。任何可以澄清我的误解的帮助将不胜感激。
-穆斯塔法
【问题讨论】:
标签: linq-to-sql asp.net-mvc-2 repository-pattern