Aggiornamento: ho aggiunto alcuni diagrammi per aiutare a capire
Ho avuto una discussione con un collega su due diversi approcci nella mappatura degli oggetti dati. Mi piacerebbe avere la tua opinione su pro e contro tra i due approcci.
Alcune informazioni di base. Abbiamo due servizi esterni. Uno è raggiunto su SOAP, l'altro su REST. Restituiscono oggetti di natura simile (punti di consegna postali). Poiché sono diversi servizi esterni, gli oggetti dati sono diversi. Ad esempio (semplificando eccessivamente gli oggetti dati reali):
public partial class ParcelShopA
{
public string City { get; set; }
public string Address1 { get; set; }
}
e il servizio 2 potrebbe essere:
public partial class ParcelShopB
{
public AddressB Address { get; set; }
}
public partial class AddressB
{
public string Street { get; set; }
public string HouseNumber { get; set; }
public string City { get; set; }
}
Ora, l'obiettivo è combinare le risposte dei due servizi in un unico formato unificato ed esporlo. Quindi abbiamo la nostra classe:
public class UnifiedAddress
{
public string Address { get; set; }
public string City { get; set; }
}
Ecco un diagramma che mostra il problema iniziale, prima di applicare qualsiasi soluzione:
Approccio1:lamiaideaeradicreareunmapperseparatopercaso.Nellamiamente,èsemplicecasodiprogrammazionefunzionale,incuivogliamopassaredall'oggettoAall'oggettoB.
publicclassConverterA{publicUnifiedAddressConvertToUnified(ParcelShopAp){//TODOimplement}}
elostessoperB:
publicclassConverterB{publicUnifiedAddressConvertToUnified(ParcelShopBp){//TODOimplement}}
Ora,tienipresentecheogniservizioverràimplementatoall'internodiunprogettodicodiceseparato(probabilmenteancheunmicroservizioseparato),quindituttalalogicasaràcontenutalì.
Eccocomesarebbelasoluzione:
Approccio2:l'approccioalternativoerasimilealseguente:
- Definisciun'interfacciacome
IParcelShop
chedefinisceirequisitipertuttiinegozidipacchi - Definisciunaclassecheconverteda
IParcelShop
all'indirizzounificato - DatochesiamoinC#eabbiamoclassiparziali,implementa
IParcelShop
inognioggettodati.
Quindiavremoqualcosacome:
publicinterfaceIParcelShop{stringGetAddress();stringGetCity();}
eilmapperconvertedaIParcelShop
:
publicclassMapper{publicUnifiedAddressConvert(IParcelShopparcelShop){returnnewUnifiedAddress{City=parcelShop.GetCity(),Address=parcelShop.GetAddress()}}}
Ora,datocheabbiamoclassiparziali,possiamoaggiungerequestafunzionalitàaglioggettidatideiservizi,ades.perilprimopaccosarebbe:
partialclassParcelShopA:IParcelShop{publicstringGetAddress()=>Address1;publicstringGetCity()=>City;}
eperilsecondoforse:
partialclassParcelShopB:IParcelShop{publicstringGetAddress()=>Address.Street+" " + Address.HouseNumber;
public string GetCity() => Address.City;
}
Ecco un diagramma che mostra la seconda soluzione:
Nella mia mente il primo approccio è molto più pulito perché non tocca gli oggetti dati, non si basa su classi parziali e contiene la logica di mappatura in un unico posto.
Quali argomenti presenteresti a qualcuno per convincerlo a favore dell'una o dell'altra soluzione?