2015-01-09 1 views
0

Учитывая, что у меня есть модель, обозначающая город, в котором хранится коллекция улиц.Соотношение сторон DTO для вложенных коллекций

public class City { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Street> Streets { get; } 
} 

public class Street { 
    public int Id { get; } 
    public string Name { get; } 
    public IEnumerable<Building> Buildings { get; } 
} 

Если клиент заинтересован в всех городов (api/cities/all) и я бы вернуть его полную коллекцию, это приведет к массивному реакции, в зависимости от размера набора данных. Так что я думал сначала о возвращении только улицы ids внутри улиц коллекции. Это, однако, кажется неудобным, поскольку в то время как ids могут быть полезны для дальнейшего поиска улиц, они не имеют значимого значения для клиента (нет смысла заполнять список ids на вид, чтобы показать, что улицы находятся в городе, не так ли?).

Моя следующая идея состояла в том, чтобы угробить улицы коллекция полностью и вместо того, чтобы предложить API конечной точки для извлечения улицах из города:

api/cities/3737/streets 

Таким образом, я могу принести полный список улицы, однако возвращенные данные тогда не содержат никакой информации, к которой относятся улицы. Если я клиент сейчас захочет показать и улицы и город, ему нужно будет сделать 2 вызова API, чтобы получить нужную ему информацию.

Каков общий способ возврата таких данных?

+0

По правде говоря, нет абсолютно правильного способа сделать это. Вам нужно решить, что хорошо для производительности вашего приложения. То, что хорошо для одного приложения, плохо для другого. –

ответ

1

Я бы создал 2 городских объекта, городской объект, содержащий только базовые данные (например, ID & Name) и объект cityDetail, содержащий все данные (включая полный план улицы).
В зависимости от вашей ситуации вы можете повторить этот шаблон для зданий.
Затем вы можете вернуть объект города в свой список, и только если выполняется идентификатор get by id, вы вернете объект cityDetail.


Плохой => ваш api является «несогласованным», поскольку объекты города, которые вы получаете через список, не совпадают с теми, которые вы получаете через get. Вы можете сделать 2 ресурса: city & cityDetail with cityDetail, не имеющий функции List и города, не имеющей функцию getByID, но все же это не так чисто. & предсказуем как единый ресурс.

Хорошее => Производительность мудрого & Использование мудрого, это, как правило, идеальное совпадение. Вы никогда не будете показывать список городов с улицами, чтобы объект города был достаточным. Когда вы просматриваете один город, очень вероятно, что вы хотите показать все данные, включая улицы (или, по крайней мере, использовать эти данные на этой странице), чтобы объект cityDetail также поместился здесь.
Производительность разумно, очевидно, что получение 1 милионных улиц для вызова getAllMyCities является излишним;)