【问题标题】:Question about Domain Objects, A Service Layer, and Using Linq2SQL and ASP.net MVC with the Repository Pattern关于域对象、服务层以及将 Linq2SQL 和 ASP.net MVC 与存储库模式一起使用的问题
【发布时间】:2011-01-05 05:12:15
【问题描述】:

首先,对于下面对我的大脑空间的冗长描述,我们深表歉意。我仍然在思考许多这些新想法,所以我确定我描述的东西不正确。请随时纠正我的错误。

我们正处于一个新的 ASP.net MVC2 站点的研发阶段,并希望确保我们能够 1) 将我们的数据存储与我们的应用程序分离,2) 允许我们的应用程序通过单元测试进行测试,以及 3) 允许我们要更改我们的数据存储或使用 Linq2SQL 以外的其他东西。

这个看似简单的目标为我打开了一个全新的世界,其中包括存储库模式、IoC、DI 以及其他各种让我头疼的东西。以下是目前关注的焦点,或者至少我认为是实现我们目标的一些正确的计划:

  1. 我们将拥有许多 ISpecificRepository 接口,用于定义接口用户与基础数据存储之间的契约。

  2. SpecificRepository 实现将查询特定的数据存储并返回代表我们的域对象(或它们的集合)的 POCO。

  3. 我们的服务层将使用传递给各种服务方法的 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


    【解决方案1】:

    我们特定的 Linq 存储库 实施现在必须容纳 所有许多 Get 查询 服务层需要实现 高效的业务逻辑。

    我很好奇这是否以某种方式 打破存储库模式

    一点也不。存储库是域实体的集合。如果我有一个RepositoryAccounts,那么想要Accounts.ThatAreOverdue() 是完全合理的。

    我个人更喜欢流畅的命名。 Accounts.ThatAreOverdue() 感觉比 AccountRepository.GetOverdue() 好.. 但我想这是一个偏好点。

    此外,所有示例 IRepository 我见过的界面看起来很 轻量级,只提供几个 GetByID、GetAll、Find、 插入、删除和提交更改到 底层数据存储。

    存储库接口可以很薄。 Find 旨在与规范模式一起使用。将标准封装在另一个对象中。标准的实现可以通过 Linq2Sql 对象进行查询 - 但针对内存中的域对象重用标准类将更加困难(与涉及 Linq2Sql 的数据库相比)。

    我们的服务层将执行 特定于应用程序的业务逻辑 使用一个实例 ISpecificRepository 传递给 各种服务方法并通过这些 POCO 域对象返回给我们 表示层。

    您是说您的逻辑都将在服务中,而“域对象”将是属性包并绑定到视图中?

    我认为我不建议这样做。

    如果视图中也使用了应用程序逻辑中使用的同一对象,那么您将两个应用程序层紧密耦合,经验表明这会导致问题。如果视图使用相同的对象,则很难通过更改来保持服务和域的一致性。视图将需要数据片段,它们将不可避免地卡在它们并不真正属于域的地方。

    【讨论】:

    • 感谢您的回复——关于最后一点——我的意思是我们的表示层中的控制器操作将调用服务层并使用返回的结果(POCO、标量值等等。 ..) 为视图建立自己的模型。这似乎是一个更好的解释?再次感谢。
    • 啊,是的。听起来好多了。
    猜你喜欢
    • 2011-06-10
    • 2010-10-14
    • 2011-05-21
    • 2012-03-26
    • 2010-09-11
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多