5

我正在构建我的第一个SPA,我已经尽可能为每个实体构建DTO,但我只是觉得轻而易举,它似乎需要将您的更改序列化为裸露最小包来优化更新/添加/等。Breeze在单页应用程序中是否需要DTO?

我建立DTO的原因是为了“扁平化”我的数据并限制了我在网络上投入的数据量,但是我想知道如果Breeze处理它,是否还需要这些开销。

+0

大问题!不需要DTO的扁平化。 – 2013-03-21 01:36:49

+0

如果您想要保护敏感数据(例如HR表中的工资信息),DTO's很适合使用。 – mikekidder 2013-03-22 06:44:06

+0

对我而言,使用DTO的主要原因是将DAL与表示层分离。有了Breeze/EF,将实体直接发送到客户端是非常诱人的,只是因为这么多只是开箱即用。但没有解耦,数据库修改可能需要代码重构,直到客户端JavaScript。害怕。 – 2013-10-12 13:51:44

回答

5

有DTO的原因。 “展平数据”是而不是其中之一。也没有“限制我在线上输入的数据量”。

Breeze在对象图上做的不错。想象一下,为客户发送100个订单。您不想在每个订单DTO上重复客户名称。在Breeze中,您查询客户订单(使用“展开”),您将获得客户的一份副本以及订单。

 
var query = new breeze.EntityQuery.from('Customers') 
      .where('Id', 'eq', 42) 
      .expand('orders'); 

在另一方面,如果你只是想客户名称的列表,请使用“投影”:

 
var query = new breeze.EntityQuery.from('Customers') // all customers 
      .select('id, companyName'); // project into an anonymous 2-property object 

使用偶尔服务器端DTO建立的东西,你不能轻松地从客户端创建(例如,Customer-and-Total-current-year-order-dollars)。

问题是,您可以混合使用DTO,预测和实体查询来满足您的需求。你不必一个一个或另一个(在我看来)。

+0

很好的答案。微风可以很容易地做投影,并帮助限制电线上的数据。事实上,你也可以用任何支持OData的javascript客户端来做到这一点。我认为如果这些原因是不需要DTO的。 – 2013-03-21 01:36:33

+0

感谢病房! SSS – JakeP 2013-03-22 15:40:07

1

我们正在评估从Knockout到Angular和Breeze的变化,以摆脱我们编写的大部分DTO和DTO映射代码(服务器和客户端代码)。我们所做的就是不公开DAO,但为所有实体创建DTO。最后发生的是,我们在很多情况下(并非全部)看起来类似于数据库对象90%的类。这导致我们认为DTO在我们的案例中没有意义,我们花费的开销是浪费精力,我们需要用更好的方法摆脱这种情况。因此,重构一轮必须开始:-)

既然我们在这里有两个专家(@约翰和@沃德)在一个地方,我也将有机会回答这个问题,并进一步提出一个有关实施,到目前为止,我还没有完全回答自己,也许约翰和沃德可以澄清这一点,因为我认为如果仍然需要DTO,这是问题的重要方面。

看着微风,它似乎有很大的帮助,以避免大量的DTO和DTO-Mapping代码,我完全同意使用DTOs和微风一起减少电线的使用是没有意义的,因为那是如上面用客户端上的查询所解释的那样,这是通过微风完美处理的。这是我可以完全确认并且合理的。与我们一样创建许多不同的DTO类并不是最好的方法。 Breeze通过少得多的代码就可以做得更好。

要使用DTO和DTO映射代码为关注我仍然认为这是一个好主意,原则分离,但它与同样大量的开销这可能是在没有必要的情况较多。因此,为了利用微风,您当然可以创建DTO并在客户端编写/生成元数据,但这不是轻而易举的基本概念。你可以这样使用它,但是留在DAO上的代码越多,你需要编写的代码越少,项目的速度也越快。但是,尽管如此,微风可以让你这样做,所以框架也将与DTOs一起工作,但它并不是微风写作的基本思想。两者混合(DAO和DTO的暴露)可能是最好的方法。

但是,当然后使用DTOs?

  • 安全
  • 复杂逻辑(计算),或当你不能够使用,你不上客户端将不会或不能(安全)具有简单的CRUD方法,因为太复杂的 。

在安全的情况下,我其实不是100%肯定的,这就是为什么我在这里写作,想问两位专家。我们在服务器端使用EF,可能最好的想法是在服务器端使用预测来确保安全性。但如何做到这一点?

我提出这个问题是因为我认为如果DTO仍然需要,它能够回答这个问题是最重要的。

我们与EF下面的代码(在我们的评估演示)结束:

private IQueryable<News> RestrictFields(IQueryable<News> query) 
    { 
     return query 
      .ToList() // This seemd to be needed, otherwhise I cannot use new News() 
      .Select(t => new News() 
       { 
        Id = t.Id, 
        Text = t.Text, 
        Title = t.Title, 
        Date = t.Date 
       }) 
      .AsQueryable(); 
    } 

所以你可以在上面看到,我们有一个EF查询。所以我们第一次尝试的只是新的新闻()的投影。这是行不通的,因为EF不允许你在投影中使用相同的DAO类,只是DTO对象或匿名类。所以我们使用了ToList()和AsQueryable()的解决方法。但是这看起来不正确,而且可能来自客户端的查询参数不会被发送到数据库,并且可能有些无法正常工作,因为这样,就像“扩展”。

那么,出于安全原因,在服务器端进行投影的最佳方式是什么?为了最终真正摆脱对DTO的需求,最好的方法是什么? @John:我看到你的帖子在你说的地方,你在你的演示项目的演讲者(Angular和Breeze)上使用了演讲者的投影,但是我没有发现它在哪里实现。

在这里,我真的被卡住了,这对我来说是缺少的链接,以知道DTO是否仍然需要,以及它如何与Breeze一起完美地工作。

我希望我的回答有助于回答你的问题,并且我希望它也为你提供了一些非常重要的微风使用链接,以及如果DTOs仍然是必要的。

亲切的问候,

克里斯

相关问题