Posso mappare i tipi in cui l'origine ha meno campi rispetto alla destinazione?

4

Dire che ho un oggetto Business come questo:

public class CustomerBusiness
{
  Guid ID;
  decimal Salary;
  datetime DateOfBirth;
}

e un oggetto dati come questo:

public class CustomerData
    {
      Guid ID;
      decimal Salary;
      datetime DateOfBirth;
      string Name;
    }

Dire che conosco il nome e l'indirizzo quando mappo l'oggetto business all'oggetto dati.

CustomerBusiness customerBusiness = new CustomerBusiness();
customerBusiness.Id = Guid.NewID();
customerBusiness.Salary = 30000M;
customerBusiness.DateOfBirth = new DateTime(1960,01,01);

string name = "Bert";

Credo di avere due opzioni:

1) Modifica l'oggetto CustomerBusiness per includere name e address membri.

2) Fai questo nell'applicazione:

CustomerData = AutoMapper.Mapper.Map<CustomerData>(customerBusiness);
CustomerData.Name = AutoMapper.Mapper.Map<string>(name);

3) Fai questo:

string name = "Bert";
CustomerData = AutoMapper.Mapper.Map<CustomerData>(customerBusiness);
CustomerData.Name = name;

Quale opzione è più appropriata? C'è un'altra opzione che non ho considerato?

Mi rendo conto che questo può sembrare un po 'pedante in quanto tutte le opzioni funzionano, tuttavia sto cercando di seguire il principio del minimo stupore.

    
posta w0051977 10.01.2018 - 20:40
fonte

1 risposta

2

Sì. È possibile mappare i tipi in cui l'origine [dominio] ha meno campi rispetto alla destinazione [DAL] semplicemente mappando solo i campi del dominio e ignorando il resto dei campi DAL. A seconda del tuo ORM, questo richiederà di ripopolare l'entità DAL di destinazione prima della mappatura, in modo che gli altri campi non vengano "persi" o scritti in modo tale che solo i campi mappati al dominio vengano mantenuti nel database tramite una sorta di "aggiornamento" set destable set1 = @ data1 dove id = @ id 'statement.

Nota: questo è un dettaglio di implementazione DAL puramente, ma riguarda il fatto che gli oggetti Dominio siano nuovi () ed up e le sue proprietà assegnate direttamente. Se questo non è un codice di esempio, potrebbe non funzionare all'interno della filosofia DDD.

Ill Ignora lo strumento di mappatura automatica per il momento perché potrebbe confondere il problema.

Assunzione 1: A [customerbusiness] può esistere solo se esiste anche un [cliente] (ed è stato mantenuto).

Assunzione 2: [customerbusiness] è una radice di aggregazione separata per [cliente]

Assunzione 3: stai usando un ORM per rappresentare il tuo DB e generare le strutture degli oggetti di dati

Quindi in questo caso sembra semplice, l'implementazione DAL di CustomerBusinessRepository fa in modo che solo gli elementi di dati rilevanti nel db vengano modificati durante un salvataggio, ad esempio:

public class CustomerBusinessRepository  : ICustomerBusinessRepository 
{

  public Save(Domain.CustomerBusiness domainEntity) {
     DAL.CustomerData dalEntity = _DB.FetchById<CustomerData>(domainEntity.Id);
     MapToDal(domainEntity, dalEntity);
     _DB.Update(dalEntity);
  }

  /*This just for example, use your own Mapper */
  private void MapToDal(Domain.CustomerBusiness domainEntity, DAL.CustomerData dalEntity) {
     dalEntity.Salary = domainEntity.Salary;
     dalEntity.DateOfBirth = domainEntity.DateOfBirth
  }
}
    
risposta data 18.01.2018 - 04:50
fonte

Leggi altre domande sui tag