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?