2011-04-03 30 views
6

Estoy creando una aplicación MVVM. Estoy tratando de estructurar mi aplicación como esta:MVVM y capas, implementación de la capa de servicio

enter image description here

no sé si este enfoque es común en MVVM. De todos modos, ViewModel usa la capa de servicio para, por ejemplo, poblar el modelo o la colección Observable que está envolviendo. Para hacer uso de sus servicios, el modelo de vista tiene un campo que contiene una abstracción del servicio, así:

IService service; 

porque uso de LINQ para consultar la base de datos, que tienen las entidades que tienen los mismos nombres que mi dominio nombres. Para que ViewModel no tenga conocimiento de las entidades de Capa de servicio/Base de datos, necesito que la Capa de servicio devuelva un Modelo de dominio en lugar de una entidad de base de datos generada por Linq. Lo hago de la siguiente manera (un ejemplo de algo que estoy trabajando en el trabajo):

ObservableCollection<ItemTypeViewModel> GetItemTypes() 
{ 
    DataContextLocalDB dc = new DataContextLocalDB(); 
    ObservableCollection<ItemTypeViewModel> itemTypes = new ObservableCollection<ItemTypeViewModel>(); 

    foreach (ItemType itemType in dc.ItemTypes) 
    { 
     Models.ItemType type = new Models.ItemType(); 
     type.Name = itemType.Name; 
     type.Description = itemType.Description; 

     ItemTypeViewModel itemTypeViewModel = new ItemTypeViewModel(type); 

     itemTypes.Add(itemTypeViewModel); 
    } 
} 

Hay un par de cosas que no estoy satisfecho/seguro acerca de:

  • Es este un buen forma de estructurar en combinación con MVVM?
  • Estoy obligado a usar Models.ItemType para hacerlo diferente del ItemType que viene de la base de datos. ¿Es esto inevitable?
  • Devolveré una ObservableCollection - tal vez otra cosa sería mejor devolverla y luego en algún lugar hacer lo que devolví una ObservableCollection?
  • En general, ¿qué podría mejorarse o qué podría ser un error de juicio que vea que hice?

Gracias :-)

Respuesta

2

simplemente no hay razón para volver a crear los datos de objetos que LINQ crea para usted. Simplemente páselos al ViewModel y estarás bien. Puede parecer que TIENE que crear un desacoplamiento entre el Dominio y el Modelo de Vista, pero como estas Entidades solo contienen propiedades y no lógica, está bien pasarlas, y también sería mucho más fácil de programar .

todo lo demás es muy actual. Una cosa es que no usaría LinqToSql, sino EntityFramework. se ve más o menos igual, solo L2SQL es una cosa de abandono de MS.

+0

Sí, lo sé acerca de la L2SQL. Acerca de la Entidad y el Modelo de Dominio, ¿dices que puedo dejar de tener un Modelo de Dominio? En muchos ejemplos sobre MVVM, veo personas que tienen un modelo que devuelven, algo como esto: 'foreach (Person person en this.db.Person) {this.persons.Add (new PersonViewModel (person));', donde Person is un Modelo de Dominio, no una Entidad. El Modelo de Dominio de Persona es como dicen Anemic. ¿Por qué uno tendría un Modelo de Dominio si son lo mismo que la entidad? – TheDude

+0

Eso es exactamente lo que estoy diciendo. en cuanto a por qué están replicando objetos sin necesidad, ¡pregúnteles! ;) –

0
public partial class ItemType : EntityObject //this is your Entity Model 
{ 
    public string Name{get;set;} 
    public string Description{get;set;} 
} 

No puede editar la sección anterior.

Si desea extender el modelo por viewModel. Crear Otra clase

public partial class ItemType : EntityObject // this is your ViewModel class,this place on another file 
{// Important: in same namespace 

    public void SomeMethod(){} 
    public ICommand CustomCommand {get{...}} 
    public string CustomProperty{ 
     get{ return localVar;} 
     set{ localVar=value; 
      onPropertyChanged("CustomProperty"); 
      }} 
} 

Por último:

public IQueryable<ItemType> GetItemTypes{ 
    get{ 
    DataContextLocalDB dc = new DataContextLocalDB(); 
    return dc.ItemTypes; 
    } 
} 
+0

Gracias por su respuesta! – TheDude

+0

Erm, no ...¿Por qué estás creando clases parciales? Esto no es MVVM. ViewModels debe ser envoltorios que toman la instancia del modelo como un parámetro de constructor. – Heliac

Cuestiones relacionadas