映射

2014-03-30 41 views
0

我映射我的一些代码,服务层内,如下所示:映射

var authors = _repository.FindAll().Where(x => x.IsActive == 1).ToList(); 
authorViews = authors.ModelToViewModelCollection(); 

但我的前辈劝我映射库层内如下:

return (from c in Context.Books 
        .Where(x=>x.IsActive == 1) 
        select new BookDetailsView 
        { 
         ID = c.ID, 
         TitleB = c.TitleB, 
         TitleE = c.TitleE, 

        }).ToList(); 

的区别是什么在两者之间。

回答

1

的主要区别在于,在第一种情况下,控制器(或服务)将直接操纵EF建立查询。不管你如何写它,这不是存储库模式。

第二种方法保持在仓库里的EF操作和直接返回视图模型,因而上层不知道你正在使用EF并没有建立一个查询。

库的目的是从持久性脱钩其他层即其他层只知道有关存储库,并只与特定的给它们的对象处理。这样,持久性可以优化对象的存储/检索方式,而不会影响其他图层。这意味着你可以在你的持久化中使用EF,Nhibernate,mongo db等,这取决于应用程序和业务层的最佳状态,或者UI永远不知道它,并且当你改变持久性时永远不需要改变。

如果你想知道你多少时间切换分贝或改变持久性,开关db是非常罕见的,但不断变化的持久性模型(表,列等)是很经常,开发时尤其如此。存储库可帮助您仅在持久性中保留更改。

+0

数据检索时有什么影响?假设我的模型类有8个属性,但viewmodel类仅包含03.如果我遵循第二个选项,有机会提高数据检索性能? –

+0

通过你的模型,我想你是指EF(持久性)模型。该存储库不是为了改善性能,而是为了保持事物分离。就你而言,我认为没有性能差异,查询将是相同的,但对于涉及更复杂模型的其他情况,存储库允许您灵活地执行所有需要的db魔法。 – MikeSW