Рефакторинг для проектирования шаблонов: применение шаблона адаптера к стороннему API - PullRequest
2 голосов
/ 08 марта 2011

Чтобы получить доступ к данным для нашей базы данных учетных записей, нам нужно пройти через сторонний API, который является просто еще одной сборкой, добавленной в качестве ссылки на наше решение.

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

 ICustomers customerCollection =GetCollection(OrgId,OrgUnit,CustomerInfo, "Customers");
       {
           customerCollection.Filter.Add("MasterCustomerId", QueryOperatorEnum.Equals, masterCustomerID);
           customerCollection.Filter.Add("SubCustomerId", QueryOperatorEnum.Equals,subCustomerID);
       }
       customerCollection.Fill();

После вызова customerCollection.Fill() API выходит в базу данных и запускает запрос с соответствующими фильтрами.Возвращенные объекты принадлежат API.В этом сервисе есть много вызовов API, все с уникальными требованиями к фильтрации.

Я хотел бы использовать шаблон Adapter, чтобы поместить эти вызовы в мои собственные классы и вернуть принадлежащие мне объекты.Затем я могу написать код для моих адаптеров из моего сервиса и позволить им беспокоиться о вызове стороннего API.

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

Я мог бы создать методы расширения / статики, которые превращают систему фильтрации API в плавный синтаксис, поэтому он может выглядеть следующим образом:

customerCollection.Filter(“MasterCustomerId).Equals(masterCustomerId).Filter(SubCustomerId).Equals(subCustomerId).Fill();

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

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

1 Ответ

2 голосов
/ 09 марта 2011

Я бы не пытался воссоздать их API с вашими объектами.Это создаст очень тесно связанную ассоциацию и вряд ли принесет вам много пользы.

Ваш адаптер, вероятно, должен обеспечивать более ориентированный на домен интерфейс, например

public IList<MyCustomerObjects> GetCustomers()
{
    //Call out to the third party API with the appropriate filters

    //foreach object in 3rd party collection, wrap in adapter class and add to list

    //return list of your objects
}

(Это в значительной степени шаблон репозитория из проекта Domain-Driven design.)/ понятия уровня домена.

...