Qual è il modo migliore per ottenere un elenco di oggetti Business da un elenco di entità?

1

Sto usando il framework di entità per ottenere un IEnumerable<CustomersEntity> , e ho bisogno di lanciare questo a IEnumerable<CustomerBO> per visualizzarlo in qualche vista. So come eseguire il cast di IEnumerable<T1> su IEnumerable<T2> ; ma in questo caso, chi ne sarà responsabile? Pensavo che CustomerBO potesse farlo, ma è corretto che un oggetto restituisca un elenco di se stesso? o devo scrivere un livello con una sola funzione? Sono in un progetto MVC, quindi forse il controller potrebbe essere coinvolto; ma se possibile, preferisco disaccoppiarlo dal DAL ...

Ecco cosa ho attualmente:

Entità:

public class CustomerEntity
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public IEnumerable<Invoices> Invoices { get; set; }
}

E oggetto business:

public class CustomerBO
{
    public string FullName { get; set; }
    public string FullAddress { get; set; }
    public string InvoicesNumber { get; set; }
    public string InvoicesTotalAmount { get; set; }

    public CustomerBO(CustomerEntity customer)
    {
        //Instanciate the object
    }
}

Nota ho bisogno di un processo unidirezionale; Non dovrò inserire un CustomerBO nel database.

    
posta gobes 16.06.2017 - 15:14
fonte

1 risposta

2

La tua classe CustomerBO non dovrebbe avere riferimenti all'entità EF. Questa conversione dovrebbe avvenire in un repository. Se l'oggetto business ha un riferimento all'entità, è ancora accoppiato al database e può essere difficile eseguire simulazioni, "what-if-scenari" ect, indipendentemente dai dati, se necessario.

public class CustomerRepository
{
     // dont forget to close your connections, which I left out...
     public CustomerBO GetCustomer(id)
     {
          return Map(DBContext.Customers.Where(c => c.Id == id).Single());
     }

     public IEnumerable<CustomerBO> GetAllCustomers()
     {
          return Map(DBContext.Customers.Select(c => Map(c));
     }

     private CustomerBO Map(CustomerEntity entity)
     {
          CustomerBo bo = new CustomerBO();
          bo.FirstName = entity.FirstName;
          //etc
          bo.InvoicesNumber = entity.invoices.Count();
          bo.InvoicesTotalAmount = entity.invoices.select(i => i.Amount).Sum();
     }


}

Potresti pensare, questo sembra lento, ma non essere tentato dalla sirena di ottimizzazione prematura. Inoltre, se sei molto preoccupato della velocità, dovresti usare Dapper.net invece di entity framework.

Quindi chiami il repository dal tuo controller e mappi il BO al modello di visualizzazione nel controller, o usi semplicemente il BO direttamente se questo è adatto ai tuoi scopi.

C'è ancora l'accoppiamento all'interno del repository, ma è limitato a solo lì, quindi se hai bisogno di cambiare il tuo DB, devi solo cambiarlo in un posto

    
risposta data 16.06.2017 - 17:50
fonte

Leggi altre domande sui tag