Какие существуют шаблоны для перевода данных из одного типа в другой? - PullRequest
2 голосов
/ 31 августа 2010

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

Допустим, у меня есть веб-сервис на сервере моей компании, который отвечает за получение заказа на продажу от стороннего поставщика. После того, как поставщик вызывает веб-сервис, у меня должен быть строго типизированный объект с именем MyVendor.CustomOrder. Затем я отвечаю за синтаксический анализ экземпляра MyVendor.CustomOrder, чтобы правильно отформатировать данные как «заказ» в системе моей компании.

У меня уже есть хранимые процедуры для вставки данных в базу данных, и я даже создал вспомогательные методы для связи с хранимыми процессами. У меня также есть интерфейсы, такие как IOrderHeader, IOrderPayment и т. Д., Которые существуют как «контракт» для данных, которые будут использоваться этими вспомогательными методами.

Я пытаюсь выяснить, существует ли хороший шаблон для анализа данных в исходном объекте MyVendor.CustomOrder для предоставления данных для интерфейсов IOrderHeader и других . Вот как я мог бы визуализировать, как эти части собираются вместе (на минимально полезной диаграмме ASCII):

________________________________
|                              |
| Web Service to receive order | 
|                              |   
|  __________________________  |
|__|                        |__|
   |  MyVendor.CustomOrder  |
   |________________________|

               ||
               ||
               \/
   __________________________
   |                        |
   | ?????????????????????? |
   |          Parse         |
   |  MyVendor.CustomOrder  |
   |   and pass data to     |
   |        next step       |
   | ?????????????????????? |
   |________________________|

               ||
               ||
               \/
        _________________________   
        |                       |
________|________               |
| IOrderHeader  |               | 
|_______________|   Methods     |
________|________     to        |
| IOrderPayment |   Add Data    |
|_______________|     to        |
________|________   Database    |
| IOrderDiscount|               |
|_______________|               |
________|________               |
|  IOrderItem   |               |
|_______________|               |
        |_______________________|

               ||
               ||
               \/
   __________________________
   |                        |
   | Data Access Layer,     |
   | Database, etc....      |
   |________________________|      

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

public class MyVendorCustomOrderParserAndDatabaseUpdater
{
     private IOrderItem _IOrderItem;
     //other private interface instantiations

     public MyVendorCustomOrderParserAndDatabaseUpdater(
                MyVendor.CustomerOrder customOrder)
     {
          ParseOrderIntoInterfaces(customOrder);
     }

     private void ParseOrderIntoInterfaces(
                 MyVendor.CustomOrder customOrder)
     {
          //Parse customOrder into _IOrderItem, etc.
     }

     public bool SendOrderToTheSystem()
     {
         //Call the helper methods with the data
         //from the private _IOrderHeader, etc. objects
         //to update "the system"
     }
}

Я бы тогда использовал этот объект с кодом наподобие этого:

... = new MyVendorCustomOrderParserAndDatabaseUpdater(
        customOrder).SendOrderToTheySystem();

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

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Это хороший пример для шаблона адаптера .

Преобразование интерфейса некоторого класса b в интерфейс a, который понимает некоторый клиентский класс c.

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

0 голосов
/ 01 сентября 2010

В некотором смысле то, что вы делаете, чем-то похоже на сериализацию. Например, XmlSerialization преобразует объект в XML, а затем обратно в объект. Вы хотите преобразовать MyVendor.CustomerOrder в набор объектов в вашей системе (OrderHeader и т. Д.), А затем обратно в исходный объект.

Если вы следуете этому шаблону, у вас будет объект картографирования, который знает, как конвертировать из одного «формата» в другой. Объект сопоставления XmlSerialization - это объект XmlSerializer (настроенный для конкретного типа объекта). Вы можете реализовать эквивалентный объект отображения, который знает, как перенаправлять данные между двумя форматами.

0 голосов
/ 31 августа 2010

Итак, у вас есть класс, представляющий заказ в том виде, в котором его видит сторонний поставщик, и класс, представляющий заказ в том виде, в котором его видит модель вашего домена, верно? Я не знаю, помогает ли это, но в прошлом я делал такие вещи, прикрепляя метод расширения к моим классам (DomainClass dc = ThirdPartyClass.toDomainClass ()) или имея конструктор в одном классе, который может принимать экземпляр его родственного класса и его анализ (DomainClass dc = new DomainClass (ThirdPartyClass)). У меня нет логики перевода в том же месте, где живет моя логика постоянства. Я хотел бы получить что-то вроде vendorRepository.SaveNewVendor (новый DomainClass (ThirdPartyClass)) или vendorRepository.SaveNewVendor ((ThirdPartyClass.toDomainClass ())

Не знаю, имеет ли это какое-то значение для вас или нет.

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