2010-04-06 117 views
0

Linq to SQL创建IQueryable且充满关系的对象。
Html Helpers需要特定的接口对象,如IEnumerable<SelectListItem>Linq to Sql,存储库和Asp.Net MVC ViewData:如何删除冗余?

我想可能发生:

  • 回用的LINQ的对象SQL不带任何包袱,即从LINQ的返回波苏斯到SQL对象,而不额外的域模型类?
  • 提取可轻松转换为(或者)Html帮助器对象的对象,如SelectListItem枚举?

有什么办法可以做到这一点,而不会中断关注点分离吗?一些整洁的op技巧来弥补需求?

例如,如果这是在一个存储库中,SelectListItem将不在那里。该select new是削减了从LINQ的对象没有行李SQL一个很好的方式,但它仍然引用不应该被引用的类:

IEnumerable<SelectListItem> result = (from record in db.table 
             select new SelectListItem { 
              Selected = record.selected, 
              Text= record.Text, 
              Value= record.Value } 
            ).AsEnumerable(); 
+1

您可能想要了解如何使用MVVM模式(http://en.wikipedia.org/wiki/Model_View_ViewModel),而不是将您的域模型一直显示到UI。这是一个有点相关的线程http://stackoverflow.com/questions/2581490/should-business-objects-be-able-to-create-their-own-dtos/2581636。 – R0MANARMY 2010-04-06 03:55:09

回答

2

我见过IService接口和服务类的用户。基本上它是存储库和控制器之间的一步。

优点:

  • 允许用于操纵IRepository行动的返回值
  • 关注
  • 良好的分离可以在验证逻辑住参与库前桥的方法。
  • 可与依赖注入框架的工作/模式

缺点:

  • 的代码MUCHO重复。除非您公开仓库,否则您可能会复制IService中几乎所有的IRepository方法。可以成为“全能”类。做任何事情的上帝阶级! Muahahaha ...等

我确定还有更多,但这是我见过和使用的东西。

1

在这个具体的例子,你可以创建一个ToSelectListItem( )方法或类似的部分类定义中删除重复。或者,也许延长方法会更好,以避免一些耦合。

编辑:我一般使用JSON Web服务与DTOs。我可能有ProductDto,这是我的产品L2SQL实体的扁平化JSON友好型表示。然后我只需要在我的查询中调用select ProductDto.FromProduct(product)。重复现在是最小的。

+0

有人建议具有特殊的Repository方法,这些方法根据您需要的信息返回少于完整的实体。通过这种方式,产品是产品,但是如果您只需要名称和ID,则只会填充名称和ID。 – 2010-07-09 17:13:44

+0

另一个人建议在服务器上缓存JSON对象,然后让客户端只发送“脏”或更改的属性,最后将缓存的对象与已更改的属性进行匹配。你有没有在客户端使用这种技术,那是什么软件? MS的jquery模板提案beta? – 2010-07-09 17:49:03