Considerazioni sulla progettazione del Mapper dei messaggi

2

Lungo contesto di domande, salta a tl; dr per la carne di esso.

Sto progettando un'integrazione tra due applicazioni web e siamo giunti alla conclusione che un modello di messaggio sarebbe una soluzione appropriata al problema. Il nocciolo dei requisiti è che i dati nel sistema A devono essere sincronizzati con il sistema B, attraverso un'interfaccia nel sistema A. Tutte le richieste sono richieste http. I dati nel sistema A sono un database di oggetti, i dati nel sistema B sono un database relazionale. Il sistema B accetta e restituisce JSON per ogni chiamata, mentre il sistema A utilizza formati specifici del dominio. Inoltre, tutta la logica aziendale deve essere nel sistema A. Il sistema B è una scatola nera e consente solo l'accesso al livello dati.

Ho sperimentato un Transfer Object Assembler Pattern , ma ha rilevato che non era giusto per l'integrazione. Ogni combinazione di oggetto e operazione sul sistema B deve essere ultimata con una richiesta separata. Se devo aggiornare un utente e un'organizzazione, questi devono essere in chiamate separate per separare le risorse. Usando il modello DTO qui richiederebbe un oggetto di trasferimento dati separato per ogni chiamata, che tipo di sconfigge lo scopo (per quanto ho capito).

Per farla breve, il modello del messaggio sembra essere la strada da percorrere. Punti bonus poiché è un breve salto all'utilizzo di un bus di messaggi effettivo per le integrazioni in futuro. Quindi ora l'idea è di creare un messaggio per ogni tipo di operazione. CreateMessage, UpdateMessage, ecc. Ogni messaggio dovrebbe avere un'istanza di una classe parametro che specifica il tipo di oggetto e il corpo JSON del messaggio. L'unico elemento mancante è la conversione dei dati del dominio di sistema A in JSON e JSON in dati di sistema A.

tl; dr

Voglio scriverlo correttamente in modo che il prossimo non debba mantenere un codice scritto / progettato veramente male.

Sto pensando di utilizzare il pattern Message Mapper per trasformare un oggetto dal sistema A in un messaggio Create / Update / Delete / Read con un centro JSON, in modo che possa essere eseguito nel sistema B. Il sistema A è OO, ma non supporta i generici. Sarebbe più pratico scrivere una collezione di classi che sono 1: 1 con il dominio come abbiamo bisogno di loro, o una classe monolitica che fa tutto il mapping? Non mi piace davvero l'idea di una classe molto ampia, ma poiché i generici non sono un'opzione, è difficile dire quale sia più appropriato.

    
posta Gelby 23.01.2016 - 00:26
fonte

1 risposta

-1

(Citando)

"The only missing piece is translating the System A domain data into JSON, and JSON into System A data."

Non intendo suggerirti di usare quell'altro cucciolo con cui probabilmente hai familiarità, anche (leggi), ma se puoi (1) ragionare per qualche minuto su cosa i tuoi "Dati dominio di sistema A" sembra come se fosse serializzato, nel, per esempio, il cucciolo di XML, e (2) potrebbe escogitare una semplice, generale (cioè generica), mappatura bidirezionale di facile implementazione (i dati del tuo dominio A del sistema < - > XML) quindi potresti anche voler controllare questo molto semplice, nuovo romanzo (sembra?), e l'integrazione naturale di XML all'interno di JSON, i nodi figlio e il documento di facile consultazione, che alla fine ho notato e state giocando ultimamente ultimamente:

link

(che ritengo sia anche piacevolmente girotondo, anche)

Ad esempio, come esempio forzato,

Da (dominio pseudo-codice):

class CustomerAccount
{
  string AccountNumber { get set }

  // etc
}

class Customer {
  int Id { get set }

  string FirstName { get set }

  string LastName { get set }

  DateTime CustomerSince { get set }

  Customer Referral { get set }

  CustomerAccountList Accounts { get set }
}

A (XML canonico):

<Customer>
  <Id>123</Id>
  <FirstName>John</FirstName>
  <MiddleName/>
  <LastName>Smith</LastName>
  <CustomerSince>...</CustomerSince>
  <Referral idref="456" relation="manyToOne"/>
  <Accounts relation="oneToMany">
    <CustomerAccount>
      <AccountNumber>...</AccountNumber>
      <!-- etc -->
    <CustomerAccount>
    <CustomerAccount>
      <AccountNumber>...</AccountNumber>
      <!-- etc -->
    <CustomerAccount>
  </Accounts>
  <!-- etc -->  
</Customer>

O anche (equivalente JSON di interesse):

[ { "": "Customer" },
  [ { "": "Id" }, 123 ],
  [ { "": "FirstName" }, "John" ],
  [ { "": "MiddleName" } ],
  [ { "": "LastName" }, "Smith" ],
  [ { "": "CustomerSince" }, "..." ],
  [ { "": "Referral", "idref": 456, "relation": "manyToOne" } ],
  [ { "": "Accounts", "relation": "oneToMany" },
    [ { "": "CustomerAccount" },
      [ { "": "AccountNumber" }, "..." ]
    ],
    [ { "": "CustomerAccount" },
      [ { "": "AccountNumber" }, "..." ]
    ]
  ]
]

'HTH,

    
risposta data 11.03.2016 - 07:36
fonte