Существуют ли шаблоны для API, которые должны возвращать полные или частичные графы объектов? - PullRequest
1 голос
/ 20 января 2012

Существуют ли какие-либо шаблоны / решения для решения проблемы с вызовом API, при котором в одном сценарии может потребоваться вернуть полный граф объектов (скажем, объект manager и все его отношения с персоналом), а в другом - просто вернуть один manager объект?

Идеи, которые мы сейчас распространяем:

  1. Множество методов
    В приведенном выше примере у вас будет один метод с именем get_manager(), а другой с именем get_manager_deep().
  2. Множество объектов
    Аналогично 1. У вас есть два метода, один возвращает manager, а другой возвращает manager_with_staff
  3. API, управляемый данными
    Здесь метод принимает какой-то запрос (возможно, XML), который точно определяет, какой тип объекта вы хотите вернуть, и метод возвращает, возможно, динамический объект, соответствующий запросу.

NB. Эти примеры очень упрощены, в действительности методам может потребоваться указать, откуда берутся части данных - ActiveDirectory / DB.

Кто-нибудь сталкивался с такими проблемами?

РЕДАКТИРОВАТЬ - Основная движущая сила проекта - иметь чистый и простой (но эффективный) API и объектную модель. Таким образом, некоторые из приведенных выше примеров приводят к потенциально большим (и, возможно, запутанным) графам объектов. Наличие слишком большого количества (возможно, ненужных) методов / классов может быть проблемой обслуживания.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

В проекте, над которым я работал, который не использовал никакого реального ORM, мы решили проблему примерно так:

class Manager { 
  public List<Employee> Staff { get;set;} // Not populated by default.
}

interface IEmployeeDataAccess {
  List<Staff> GetStaffForManagers(int[] managerIds);
}

Затем были созданы классы построителей, которые могли бы заполнить граф объектов:

new ManagerBuilder().From(managers).WithEmployees(employeeDataAccess).Build();

Строители могут быть соединены вместе:

new ManagerBuilder()
  .From(managers)
  .WithEmployees(employeeDataAccess, employeeBuilder => 
    employeeBuilder.WithLeaveRequests())
  .Build();

Позволяет нам получать желаемое количество данных с минимальным количеством поездок в базу данных.

0 голосов
/ 21 февраля 2012

Вы должны попытаться создать один в соответствии с вашими потребностями .. вам просто нужно два понятия .. 1. Метод цепочки 2. Рекурсия

Действительно хорошая статья о том, что такое Method Chaining в Википедии http://en.wikipedia.org/wiki/Method_chaining

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...