Обновление API и пользовательского RDB - PullRequest
1 голос
/ 12 октября 2009

Итак,

В настоящее время я работаю над проектом, в котором будут обновлены два разных источника данных.

Бизнес-объекты имеют схожие структуры, но не совсем одинаковые.

В настоящее время я планирую использовать интерфейс провайдера, поэтому у меня есть класс обработчика для отправки в обе базы данных.

Поскольку 2-й объект взят из внешнего API, я подумал, что лучше всего сделать это, протолкнув свой пользовательский объект через провайдера API, чтобы отобразить вещи вручную, так что другой разработчик, реализующий формы и т. Д. Для это могло бы сделать все это без всяких проблем.

Полагаю, мне в какой-то момент всегда придется делать отображение заново, но мне было интересно, есть ли у кого-нибудь более приятный способ сделать это в реализованных методах - ниже приведен скелет того, о чем я сейчас думаю .. есть идеи?

IBusinessObject1PushProvider
{
   Create();
}


DSOneBusinessObject1Pusher : IBusinessObject1PushProvider
{
   Create()
   {
       // move custom object into our database
   }
}

DSTwoBusinessObject1Pusher : IBusinessObject1PushProvider
{
   Create()
   {
       APIObj1 ob1 = new APIObj1();
       ob1.Name = obPassedThrough.FirstName + obPassedThrough.LastName;

       // move ob1 to the webservice having had the datamassaged.
   }
}

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Лучшим решением может быть использование шаблона адаптера .

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

Этот подход позволит вам заменить любой из источников данных, не меняя ничего, кроме адаптера над ним.

Если вам нужен короткий пример, оставьте комментарий.

1 голос
/ 29 октября 2009

Ну, моя идея при реализации такой функции будет:

  1. Предположим, что отображение один на один - это нормальное поведение
  2. Укажите исключения из правила 1

Таким образом, в основном, копируйте свойства из вашего пользовательского объекта в объект API, если совпадают имена полей и типы (вы можете сделать некоторую спецификацию для этого с атрибутами или чем-то еще); Вы можете использовать рефлексию и динамические выражения, чтобы сделать это быстро и надежно.

Чтобы указать исключения из первого правила (например, ob1.Name = obPassedThrough.FirstName + obPassedThrough.LastName; в вашем примере), вы должны указать требуемое поведение. Вы можете сделать это либо в коде, используя какой-то общий шаблон преобразования, либо указать это в XML или что-то в этом роде.

Таким образом, вы сможете создавать довольно простой код для публикации всех видов объектов в вашей собственной базе данных или сторонних организациях. Нормальные объекты, которые одинаковы с обеих сторон, сразу же работают, и разработчик может легко реализовать странное поведение.

0 голосов
/ 02 ноября 2009

Поскольку ваши хранилища данных могут быть не синхронизированы. было бы неплохо иметь какой-то флаг статуса в вашей локальной базе данных, например: -

set local_stat = IN_PROGRESS;
id = create(the_data,local_stat);
commit;
send to remote_service();
if (ok) 
then 
    set local_stat = IN_SYNC;
else
    set local_stat = OUT_OF_SYNC;
update(id,local_stat);
commit;

После этого вы сможете восстановиться после большинства ошибок.

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