在Wcf REST中,最好是返回较少的请求较大的模型,或者返回请求较多的较小模型

时间:2011-11-21 16:23:16

标签: .net wcf rest wcf-rest

我有一个SOA应用程序,并且已经开始遇到一些性能问题。

我的REST模型看起来类似于......

public class Person
{
    public Guid Id { get; set; } 
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
    public IEnumerable<Hobby> Hobbies { get; set; }
    public IEnumerable<Interests> Interests { get; set; }
    public IEnumerable<Friends> Friends { get; set; }
}

当通过REST返回所有这些字段时,这很快变成了一个非常大的模型。

所以,我的基本问题是...... 传输上面的大型模型,使用FEWER Rest调用,传输较小的对象以及使用更多的Rest调用来检索其他数据是否更好。 I.E.有这样的模型......

public class Person
{
    public Guid Id { get; set; } 
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public AddressId AddressId { get; set; }
    public IEnumerable<Guid> Hobbies { get; set; }
    public IEnumerable<Guid> Interests { get; set; }
    public IEnumerable<Guid> Friends { get; set; }
}

现在根据需要抓住其他房产......

思想?

2 个答案:

答案 0 :(得分:4)

就个人而言,我更喜欢退回较轻的物体。我可以详细说明原因,但是这篇文章为我做了很好的工作:

http://davybrion.com/blog/2010/05/why-you-shouldnt-expose-your-entities-through-your-services/

现在,在您的情况下,您可以返回对象内部的列表,然后进行REST调用以接受ID列表(在您的案例中为Guids),然后返回对象列表,这些对象本身是轻量级的。这将为您提供两全其美 - 更轻的对象和减少的REST调用次数。

答案 1 :(得分:1)

rpc通话的一般智慧是让它们变得更加厚实,但就像其他任何东西一样,这一切都取决于你的情况。 IMO你应该尽量让它变得更大,而不会拉太多数据:-) 因此,如果你有一个ui或者某种东西,你应该专注于用户任务而不是数据,并且看看用户将在该UI上执行哪些任务,以及它需要多少数据。你应该让他们拥有与任务相关的dtos,并明确地提取这些dtos,但最重要的是DTO与任务相关,而商业模式存在于服务器上(这与业务相关)。