【问题标题】:Use the repository pattern when using PLINQO generated data?使用 PLINQO 生成的数据时使用存储库模式?
【发布时间】:2010-06-16 01:51:30
【问题描述】:

我正在“升级”一个 MVC 应用程序。以前,DAL 是模型的一部分,作为使用标准 LINQ to SQL 查询的一系列存储库(基于实体名称)。现在,它是一个单独的项目,使用 PLINQO 生成。

由于 PLINQO 会根据实体的属性生成查询扩展,因此我开始直接在我的控制器中使用它们...并一起消除了存储库。

它工作正常,这更多是根据您的经验提出的问题,我应该继续走这条路还是应该重建存储库(使用 PLINQO 作为存储库文件中的 DAL)?

仅使用 PLINQO 生成的数据上下文的一个好处是,当我需要访问数据库时,我只需对数据上下文进行一次引用。在存储库模式下,当我需要数据访问时,我必须引用每个存储库,有时需要在单个控制器上引用多个存储库。

我在存储库中看到的最大好处是恰当命名的查询方法(即 FindAllProductsByCategoryId(int id) 等...)。使用 PLINQO 代码,它是 _db.Product.ByCatId(int id) - 这也不错。

两者我都喜欢,但是当查询使用谓词时,它会变得更“鹞”。我可以将其汇总到存储库查询方法中。但是在 PLINQO 代码上,它类似于 _db.Product.Where(x => x.CatId == 1 && x.OrderId == 1);我不太确定我是否喜欢在我的控制器中使用这样的代码。

您对此有何看法?

【问题讨论】:

    标签: database asp.net-mvc-2 repository plinqo


    【解决方案1】:

    -- 查询扩展--

    PLINQO 的查询扩展被设计为可链接的。这应该有助于防止事情变得过于“哈利”。 ;)

    // 拉姆达
    _db.Product.Where(x => x.CatId == 1 && x.OrderId == 1);
    // 查询扩展
    _db.Product.ByCatId(1).ByOrderId(1);

    // 更复杂的 Lambda
    _db.Product.Where(x => (x.CatId == 1 || x.CatId == 3) && x.OrderId != 1);
    // 查询扩展
    _db.Product.ByCatId(1, 3).ByOrderId(ComparisonOperator.NotEqual, 1);

    此外,对于非常复杂的查询,我们建议将自定义扩展方法添加到可编辑(被动生成)的查询扩展文件中。这使您可以将更高级的逻辑封装到一个地方,并使您的代码更简洁,更高级的逻辑更可重用。

    http://docs.codesmithtools.com/display/PLINQO/Query+Extensions

    -- 模式--

    对于模式,我们通常建议您在每次要访问数据库时在 using 语句中新建一个 DataContext。 LINQ to SQL(因此也包括 PLINQO)正在使用工作单元模式,并且旨在在小型受控范围内正常工作。

    【讨论】:

    • 这是一个很好的观点。我一直在构建自定义查询扩展,主要用于连接场景......但绝对可以构建更多。关于 using 语句......这就是我正在做的事情。我所有的控制器都派生自自定义基础控制器。由于我所有的控制器都需要访问数据库,因此我只是在基本控制器中新建了一个 DataContext。 using 语句是否有性能优势?这意味着我需要在每个控制器的几乎每个操作中都添加一个 using 语句。
    • 这是一个非常深入的答案:stephenwalther.com/blog/archive/2008/08/20/… :)
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多