2011-11-02 1 views
0

Salut, je voudrais savoir comment initialiser correctement le modèle de DB dans MVVM.Comment charger les données de DB/XML vers le modèle dans MVVM

J'utilise Caliburn.Micro Framework, pour l'injection de dépendances je peux utiliser MEF ou Castle Windsor et comme ORM je peux utiliser Entity Framework ou NHibernate.

j'ai une certaine classe modèle, il peut être POCO

public class SomeModel{} 

J'ai aussi certains modèles de vue classe

public interface IViewModelA 
{ 
ModelA SomeModel{get;set;} 
} 

public class ViewModelA : ScreenViewModel, IViewModelA 
{ 
public ModelA SomeModel{get;set;} 
} 

Je lie les propriétés de SomeModel sur la vue. Je pense que ce n'est pas une bonne vue.

Je voudrais savoir comment corriger les données de charge du référentiel (XML, DB-avec ORM) au modèle.

Créer une autre classe, par exemple, les propriétés des modèles init view de ModelManager ici?

Cet échantillon est avec Caliburn + MEF

public interface IManager{} 

[Export(typeof(IManager)] 
public class Manager :Screen,IManager 
{ 
    //import dependencies with MEF 
    [Import] 
    public IViewModelA VMA{get;set;} 

    public void Init() 
    { 
    VMA.SomeModelA=//load from DB 
    } 

} 

Ou ce qui est de manière correcte et commune? Je voudrais voir un échantillon simple du monde réel avec Caliburn.Micro + ORM (NHibernate/Entity Framework) + IoC (MEF/Castle Windsor).

Merci

Répondre

0

Bien. Vous devez trouver des informations sur DDD et Repository Pattern. En bref, un référentiel vous permet d'accéder à certaines données. Par exemple, vous pouvez avoir:

public interface ICustomerRepository 
{ 
    IEnumerable<Customer> GetCustomers(); 
    Customer GetCustomerById(Guid aId); 
} 

public class Customer 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

public class DbCustomerRepository : ICustomerRepository 
{ 
    private DbConnection Connection { get; set; } 

    public DbCustomerRepository(DbConnection aConnection) 
    { 
     Connection = aConnection; 
    } 

    public IEnumerable<Customer> GetCustomers() 
    { 
     // Do your query to DB here. 
     yield break; 
    } 

    public Customer GetCustomerById(Guid aId) 
    { 
     // Do your query to DB here. 
     return null; 
    } 
} 

public class XmlCustomerRepository : ICustomerRepository 
{ 
    private string FilePath { get; set; } 

    public XmlCustomerRepository(string aFilePath) 
    { 
     FilePath = aFilePath; 
    } 

    public IEnumerable<Customer> GetCustomers() 
    { 
     // Find all customers in a XML-file. 
     yield break; 
    } 

    public Customer GetCustomerById(Guid aId) 
    { 
     // Find a specific customer in a XML-file. 
     return null; 
    } 
} 

Vous devez passer dans votre constructeur ViewModel un de ICustomerRepository. public class CustomerListViewModel { Référentiel ICustomerRepository privé {get; ensemble; }

public CustomerListViewModel(ICustomerRepository aRepository) 
    { 
     Repository = aRepository; 
    } 

    public ObservableCollection<Customer> Customers 
    { 
     get 
     { 
      if (mCustomers == null) 
      { 
       IEnumerable<Customer> lCustomers = Repository.GetCustomers(); 
       mCustomers = new ObservableCollection<Customer>(lCustomers); 

      } 

      return mCustomers; 
     } 
    } 

    private ObservableCollection<Customer> mCustomers; 
} 

Vous devez configurer votre IoC-conteneur avec la cartographie de ICustomerRepository de service à un élément en béton (par exemple DbCustomerRepository), ainsi que d'enregistrer votre CustomerListViewModel comme moi. Mais ce n'est qu'un début d'histoire. Vous devez stocker vos données modifiées dans la source de données (DB, XML, etc.). Bien sûr, vous pouvez ajouter une méthode sur le référentiel pour sauvegarder les données mais c'est contre S.O.L.I.D. des principes. Mieux vaut utiliser le pattern Unit of Work de DDD. À un certain point, vous devrez personnaliser le client pour ajouter des propriétés et des méthodes supplémentaires pour les moyens d'affichage. Remplissez gratuitement pour créer un wrapper autour de Customer - CustomerViewModel. Quelque chose comme ça.

Questions connexes