Conversione tra dati e tipi di presentazione

-1

Sono abbastanza nuovo per cose come DI, MVVM e WPF del tutto, quindi è abbastanza probabile che questo si legge come un gigante WTF ...

Ho definito un'interfaccia nel mio livello aziendale, ISomeEntity ; quindi nel mio livello dati, ho un tipo di entità public class SomeEntity : ISomeEntity . La cosa da notare qui è che il livello aziendale non fa riferimento al livello dati.

Nel livello di presentazione, posso elencare questi elementi, dato che ViewModel della mia finestra ha una proprietà IEnumerable<ISomeEntity> (o dovrebbe essere IEnumerable<SomeEntityViewModel> ?).

Ora volevo essere in grado di contrassegnare una voce di elenco come "da eliminare" e dato che alla fine avrò un sacco di tipi "cancellabili" ho creato un'interfaccia IDeletable .

Il tipo SomeEntity nel livello dati non ha bisogno di sapere su IDeletable , quindi ho implementato l'interfaccia in una classe SomeEntityViewModel : ISomeEntity, IDeletable , nel livello di presentazione (parte di me sta iniziando a pensare che dovrebbe essere definito nello strato business / domain).

Il problema che sto avendo è che il mio modello sta sputando ISomeEntity , che in realtà è SomeEntity dal livello dati: ho bisogno di un modo per convertire da SomeEntity a SomeEntityViewModel , e dato che SomeEntityViewModel è dichiarato nel livello di presentazione, la mia unica opzione sembra avere la mia classe ViewModel avere un costruttore come questo:

public SomeEntityViewModel(ISomeEntity poco)
{
    // set the properties from the POCO implementation
}

... e quindi nella classe che contiene la logica di presentazione, posso collegare tra le due implementazioni facendo qualcosa del genere:

_viewModel.Items = _model.SelectThoseItems() // returns IEnumerable<SomeEntity>
                         .Select(e => new SomeEntityViewModel(e))
                         .ToList();

... e funziona, ma in qualche modo non sembra giusto ... o lo fa? Dato ISomeEntity , SomeEntity , SomeEntityViewModel e IDeletable , quale sarebbe il modo "comune" o "normale" di implementarlo? O ho sbagliato tutto?

    
posta Mathieu Guindon 03.09.2013 - 01:26
fonte

1 risposta

1

Preferisci non dover implementare i membri di ISomeEntity che sono irrilevanti per l'interfaccia utente. Ad esempio se l'interfaccia del tuo tipo di motore ha .ConnectionString o l'interfaccia utente potrebbe desiderare. UserName .Password ecc. Senza alcun riferimento a una stringa di connessione finché non viene chiamato il costruttore .ToSomeEntity.

Quindi non penso che sia insolito avere tipi separati per la vista che incapsulano i tuoi tipi di motore piuttosto che implementarli (è quello che faccio comunque). Ciò significa anche che le modifiche all'interfaccia o alla classe base non richiedono necessariamente modifiche nel progetto dell'interfaccia utente.

    
risposta data 03.09.2013 - 15:58
fonte

Leggi altre domande sui tag