代码之家  ›  专栏  ›  技术社区  ›  Wahid Bitar

关于Rob Conery存储库模式的几个问题

  •  9
  • Wahid Bitar  · 技术社区  · 15 年前

    请在阅读答案后阅读问题末尾的更新:

    我正在尝试应用存储库模式 作为 Rob Conery's described his blog 在“ MVC店面 “。 但我想问一些问题 在我应用这个设计之前 模式。

    罗布做了自己的“模型”,并用了一些 ORM“linq to sql or entity framework(ef)”将其数据库映射到 实体。

    然后他使用自定义存储库 给予 IQueryable<myModel> 而在 他创造的这些宝库 ORM之间的映射或“解析” Entities 他的 Model 类。

    我想问的是:

    是否可以在ORM之间进行自定义映射 实体 还有我的 型号“ classes “并且只加载 我想要的属性? 我希望 这一点很清楚。

    POCO更新

    **

    这是我经过多次建议和尝试后决定的:

    **

    毕竟,关于罗伯·科内里先生的观点,我有更好的解决办法:

    1. 我的模型是 POCO 然后把它们放在我的“模型层”中,这样它们就与“edmx”文件无关。
    2. 建立我的存储库来处理这个问题” POCO “依赖模型” DbContext
    3. 然后我创建了一个 ViewModels “仅从这些存储库中获取视图所需的信息。

    所以我这样做了 需要再添加一层 在“EF模式”和“我的模式”之间。我只是稍微扭曲一下我的模型,强迫EF去处理它。

    正如我所见,这种模式比罗布·科内里的模式好。

    4 回复  |  直到 7 年前
        1
  •  19
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    是的,如果您使用的是Linq to SQL,这是可能的。您所需要做的就是使用投影将您想要的数据提取到您选择的对象中。你不需要所有这些带有接口的装饰,如果你使用一个特定于视图的模型(听起来你需要),创建一个viewModel类。

    我们称之为ProductSummaryView:

    public class ProductSummaryView{
       public string Name {get;set;}
       public decimal Price {get;set;}
    }
    

    现在从存储库中加载它:

    var products= from p in _repository.GetAllProducts
                  where p.Price > 100
                  select new ProductSummaryView {
                      Name=p.ProductName,
                      Price=p.Price
    
                  }
    

    这将拉动价格高于100的所有产品,并返回iqueryable。此外,由于您只要求两列,所以在SQL调用中只指定两列。

        2
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    不要回避你的问题,但最终由你决定你的存储库将如何工作。

    高层的前提是控制器将指向某个存储库接口,比如 IRepository<T> where T : IProduct . 它的实现可以做很多事情——从磁盘加载整个数据库并存储在内存中,然后解析LINQ表达式以返回数据。或者它可以返回一组固定的虚拟数据用于测试。因为您需要一个存储库接口,所以您可以有任意数量的具体实现。

    现在,如果您正在寻找对Rob具体实现的批评,我不确定这与堆栈溢出有什么关系。

        3
  •  2
  •   Michael Maddox    15 年前

    虽然可以使用查询(与存储库模式无关)基于该对象的列子集的查询来填充对象的一部分,但这不是“正常”操作的方式。

    如果要返回对象的子集,通常只创建一个具有该属性子集的新类。这通常(在MVC世界视图中)被称为视图模型类。然后,使用投影查询来填充这个新类。

    无论您是否使用存储库模式,您都可以完成所有这些工作。我认为这两个概念之间没有冲突的重叠。

        4
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    延迟加载

    记住,iqueryable将所有加载延迟到最后一个负责的时刻。您可能不需要使用LINQ操作符加载所有数据来获得所需的数据。;)

    考虑到视图中域类的依赖性,我会说不,为此使用一个ViewModel模式。它更易于维护;您可以使用 AutoMapper 为了避免映射问题,它们在复合视图场景中非常灵活:)

    根据新问题…答案是肯定的,你可以。正如Rob Conery所说,使用投影;):

    var query = from p in DataContext.Persons}
    select new Persons
    {
      firstname = p.firstname,
      lastname = p.lastname
    });