关于Rob Conery的存储库模式的一些问题

时间:2010-02-16 10:12:49

标签: asp.net-mvc entity-framework orm repository-pattern poco

请在阅读完答案后阅读我的最新动态:

  

我正在尝试应用存储库模式   作为Rob Conery's described   “{em> MVC店面”下的his blog。   但我想问一些问题   在我应用这个设计之前我所拥有的   图案。

     

Rob制作了自己的“模特”并使用了一些   ORM“LINQ to SQL或Entity Framework(EF)”将他的数据库映射到   实体。

     

然后他使用了自定义存储库   给IQueryable<myModel>和   他制作的这些存储库    ORM Entities与其Model类之间的映射或“解析”。

     

我在这里问的是什么:

     

是否可以在ORM Entities和我之间进行自定义映射   模型“classes”并加载   我想要的属性?我希望   重点很明确。

POCO更新

**

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

**

毕竟并且就Rob Conery先生的观点而言,我有更好的解决方案:

  1. 我将我的模型构建为“POCO s”并将它们放入我的“模型层”中,因此它们与“edmx”文件无关。
  2. 构建我的存储库以处理依赖于“POCO”的此“DbContext”模型
  3. 然后我创建了一个“ViewModels”,以便从这些存储库中获取视图所需的信息。
  4. 所以我 需要在“EF模型”和“我的模型”之间再添加一层。我只是扭曲了我的模型并强制EF处理它。

    我认为这种模式比Rob Conery更好。

4 个答案:

答案 0 :(得分:19)

是的,如果您使用的是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

              }

这将拉动价格&gt;的所有产品。 100并返回IQueryable。此外,由于您只需要两列,因此在SQL调用中只会指定两列。

答案 1 :(得分:3)

对你的问题不是躲闪,但最终由你决定你的知识库如何运作。

高级前提是您的控制器会指向某个存储库界面,例如 IRepository<T> where T : IProduct 。其实现可以执行任何操作 - 从磁盘加载整个数据库并存储在内存中,然后解析LINQ表达式以返回内容。或者它可以返回一组固定的虚拟数据用于测试目的。因为您正在敲击存储库接口,所以您可以拥有任意数量的具体实现。

现在,如果您正在寻找对Rob特定实现的批评,我不确定它与Stack Overflow密切相关。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

DeferringTheLoad

请记住,IQueryable将所有加载延迟到最后一个负责任的时刻。您可能不必使用LINQ运算符加载所有数据来获取所需的数据。 ; )

尊重视图中域类的依赖关系,我会说不。为此使用ViewModel模式。它更易于维护;您可以使用AutoMapper来避免映射问题,并且它们在复合视图场景中非常灵活:)

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

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