2010-11-27 7 views
2

Je posais une autre question ici sur SO et un utilisateur vraiment confus me suggérant de faire ce qui suit: Je l'ai lu 1000 fois sur SO, qu'une entité ne devrait jamais faire un appel enregistrer/ajouter/supprimer via un service à la base de données. C'est la tâche du ViewModel!Dois-je appeler mes services à partir du modèle ViewModel OU du modèle de conception MVVM?

Que dites-vous?

public class School 
{ 
    private ISchoolRepository _repository; 

    public string Name { get; set; } 

    public School() 
    { 
     this._repository = IoC.Resolve<ISchoolRepository>(); 
    } 

    public bool IsValid() 
    { 
    // Some kind of business logic? 
    if (this.Name != null) 
    { 
     return true; 
    } 

     return false; 
    } 

    public void Save() 
    { 
     if (this.isValid()) 
     { 
     this._repository.Save(this) 
     } 
} 

Répondre

1

je ne voudrais pas mélanger le référentiel avec les entités soit parce que j'aime que les entités soient libres de tout état contextuel ou environnemental. Je pense que la gestion du stockage des entités relève de la seule responsabilité du référentiel. Que se passerait-il si vous avez des dépendances entre entités?

Par exemple, une école a des étudiants. Vous ne pouvez pas enregistrer les élèves tant que vous n'avez pas sauvé l'école. Vous devriez construire cette logique dans vos entités étudiantes. Vos élèves sauveraient-ils aussi l'école? Vont-ils refuser de sauver? Ont-ils besoin de vérifier la base de données pour l'école? Ils auront au moins besoin de savoir quelque chose sur l'école afin de créer une dépendance entre l'école et les élèves qui soit très difficile.

Ensuite, vous ajoutez des enseignants et vous devez ajouter une logique similaire pour eux. Votre code pour représenter ces relations et dépendances est ensuite réparti sur plusieurs entités. Pensez aux transactions aussi. Ajoutez ensuite plusieurs niveaux. Voyez-vous comme cela pourrait devenir compliqué? Bientôt, vous avez des spaghettis avec des boulettes de viande et du fromage!

C'est la responsabilité des référentiels de savoir ce genre de choses.

HTH

Vive

+0

si bien! 123 plus à emporter: P – Elisabeth

0

Appeler le service de votre entité constitue une violation du principe de responsabilité unique. Si, à l'avenir, vous avez besoin d'avoir vos entités hydratées à partir d'un magasin de support différent de celui du service, vous devrez changer toutes vos entités. Même si vous injectez le référentiel, il est toujours en violation de SRP.

0

Je ne comprends pas ce qui ne va pas avec cette approche, si je voulais échanger sur de dire serveur SQL à Oracle je voudrais simplement enregistrer un nouveau référentiel appelé « OracleSchoolRepository et assurer qu'elle satisfait l'interface ISchoolRepository.

I ne voient aucun problème avec cela? Pouvez-vous mettre en évidence un scénario où ce qui précède deviendrait un problème?

Merci!

Ben

+0

ask SRM ne me lol ;-) – Elisabeth

+0

Im vous demandant que vous semblent utiliser une autre approche? Pourquoi? Quel problème résolvez-vous? – BenjaminPaul

+0

J'essaie de résoudre ce problème => http://stackoverflow.com/questions/4288493/wpf-mvvm-re-use-a-viewmodel-in-multiple-controller-and-separation-of-concerns/4292411#4292411 vous avez déjà pris part à la discussion ;-) Je vais trouver une solution, pas aujourd'hui mais bientôt. – Elisabeth

Questions connexes