2010-09-12 4 views
0

thats la manière josh smith fait l'add-a-client procédure:Appeler les méthodes CRUD du référentiel depuis le Controller ou ViewModel?

**CustomerViewModel**.cs: 
    public void Save() 
    { 
     _customerRepository.AddCustomer(_customer); 
    } 

     **CustomerRepository**.cs: 
     public void AddCustomer(Customer customer) 
       { 
     //... 
         _customers.Add(customer); 

         if (this.CustomerAdded != null) 
          this.CustomerAdded(this, new CustomerAddedEventArgs(customer)); 

       } 

     **AllCustomersViewModel**.cs(acts as Controller): 
     void OnCustomerAddedToRepository(object sender, CustomerAddedEventArgs e) 
       { 
        var viewModel = new CustomerViewModel(e.NewCustomer, _customerRepository); 
        this.AllCustomers.Add(viewModel); 
       } 

fort texte wouldn il mieux le faire ?:

**CustomerViewModel**.cs: 
public void Save() 
{ 
    if (this.CustomerAdded != null) 
         this.CustomerAdded(this, new CustomerAddedEventArgs(customer)); 
} 

    AllCustomersViewModel.cs(acts as Controller): 
    void OnCustomer**ADDING**ToRepository(object sender, CustomerAddedEventArgs e) 
      { 
       _customerRepository.Add(e.NewCustomer); 
       var viewModel = new CustomerViewModel(e.NewCustomer); 
       this.AllCustomers.Add(viewModel); 
      } 

Cette étape le CustomerViewModel.cs pourrait également être dans le contrôleur parce que le contrôleur détient 1/toutes les références au service/référentiel du client/produit/ordre, etc ...

if (this.IsNewCustomer) 
       _customerRepository.AddCustomer(_customer); 

Lorsque j'ai encore un Order/ProductViewModel fonctionnant pour le même contrôleur, j'ai 3 instances du référentiel. Si le référentiel est dans le Ctor du contrôleur, je n'ai qu'une seule instance.

Avec l'architecture de josh smith, vous disposez d'une customerRepo dans le contrôleur et CustomerViewModel. Avec mon idée, vous avez seulement un customerRepo dans le contrôleur ET la méthode Save/Add de CustomerViewModel pourrait être souscrite à la méthode Controllers OnAddCustomer.

Pourquoi Josh Smith a pris un

public event EventHandler<CustomerAddedEventArgs> CustomerAdded; 

et non un

simple public Action<Customer> AddDocumentDelegate; 

Que pensez-vous? Voyez-vous un inconvénient dans mon idée?

Répondre

0

Votre idée est bonne. ViewModel devrait être une représentation spécifique de votre modèle et ne devrait pas appeler vos dépôts. Votre contrôleur pourrait écouter sur les événements de la vue (clic de bouton, soumettre etc.) et ensuite appeler les dépôts.

Il y a d'autres messages sur ce sujet, vous devriez vérifier -

http://www.weask.us/entry/mvvm-put-data-access-layer

MVVM where to put Data Access Layer?

+0

je toujours pensé à nouveau et voir une faille dans mon idée: Avoir 5000 CustomerViewModel objets chacun faisant en Ajouter/Enregistrer la méthode: OnCustomerAdd (client), de cette façon, je dois déclarer 5000 événements erhm ... dois lire vos liens LOL maintenant je suis confus ... – Elisabeth

+0

Oui .. faites vos avis appeler les méthodes appropriées sur le contrôleur. Ainsi, lorsque l'action de l'utilisateur vous invite à enregistrer, il suffit d'appeler save sur le contrôleur à partir de la vue, puis le contrôleur fera l'accès aux données. –

+0

juste ce que j'ai observé: josh smith a une méthode AddCustomer (enregistrer) dans le CustomerViewModel, WAF (WPF Application Framework) a la méthode AddCustomer/AddBook dans le BookController. Une vue est juste un modèle de la vue, donc il doit être passiv concernant l'inductance de la persistance des données etc ... c'est le travail du contrôleur. Hm semble que je dois avoir un regard plus profond sur WAF grande application mais pleine d'architecture: P – Elisabeth

Questions connexes