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?