2013-02-16 1 views
0

Essayer de résoudre mes dans le récipient,Résolution des services Prism dans MVVM

objets de services stockés (La plupart du temps comme des interfaces Singleton) Il y a un Module de domaine dont il est ViewModels utiliseront les services des services Module .

Où et comment recommandez-vous cela, Résolution intérieur du domaine Module ou à l'intérieur des ViewModels du module de domaine?

Si je pouvais le faire à l'intérieur Constructor de ViewModel, est assez le code ci-dessous, après le service est enregistré, si je ne veux pas faire:

public DetailsViewModel(IWService wSvc,) 
    { 
     wService = wSvc; 
    } 

Quelle est la meilleure approche obtenir la Services objets (stockés dans le conteneur) dans les «modèles de vue»?

Ce que j'ai fourni ici est juste comme un échantillon. merci pour toute aide

+0

Tant que votre modèle de vue (DetailsViewModel) est résolu par le conteneur unity, le code que vous avez ci-dessus devrait vous fournir des services dans le modèle de vue. Ce que vous avez, c'est la façon standard dont j'ai vu les applications Prism créées. Si votre modèle de vue n'est pas créé par le conteneur, vous devrez passer les services dans le constructeur du modèle de vue. Je viens d'écrire une application utilisant Prism, et j'ai largement abandonné MVVM en faveur d'une approche plus MVP comme je trouve le concept entier d'une machine virtuelle (View Model) très confus sans un présentateur ou une classe de contrôleur. – Jay

+0

@Jay merci pour l'info, désolé je n'étais pas sur le PC à ce moment-là, je suis toujours face et en essayant de comprendre et d'utiliser des parties plus sombres, je l'aime en quelque sorte et mon code manque quelques pièces J'essaie de les réparer. :) – LastBye

Répondre

2

Je recommanderais que vos ViewModels obtiennent les services qu'ils utilisent via l'injection de dépendances du constructeur. Quelle que soit l'approche choisie, vous devez garder à l'esprit que l'un des concepts principaux est la possibilité de tester vos ViewModels. Habituellement, cela implique de pouvoir fournir à vos ViewModels des mises en œuvre fictives de vos services pour tester leur comportement indépendamment de ces services. Si vous utilisez l'injection de constructeur, vous pouvez simplement créer vos services de simulation, puis les transmettre dans le constructeur de votre ViewModel pour le tester si vous deviez écrire des tests unitaires. Même si vous n'avez pas l'intention d'écrire des tests unitaires pour le moment, je pense que c'est une raison valable de prendre l'habitude de suivre un certain schéma de conception.

public class SomeViewModel 
{ 
    private IEventAggregator events; 
    private ISomeService someService; 

    public SomeViewModel(IEventAggregator events, ISomeService someService) 
    { 
     this.events = events; 
     this.someService = someService; 
    } 
} 
+0

Je suis arrivé au même point que vous avez fourni, mais une simple question à poser: Au lieu d'obtenir les services, j'ai essayé d'obtenir IUnityContainer via le constructeur et j'ai ensuite appelé une méthode définie plus tard de FetchServices là, ça va? ou Est-il recommandé dans une telle situation de rendre le conteneur singleton ou non? – LastBye

+1

@LastBye Non, ce que vous venez de décrire n'est pas une bonne idée. Vous créez fondamentalement un modèle de style singleton ou emplacement de service qui annule quelque peu le but de l'injection de dépendance en premier lieu. Vous voudrez peut-être chercher "Composition Root", même si je ne suis pas tout à fait d'accord, cela explique pourquoi vous ne voulez pas faire ce que vous venez de mentionner – Alan

+1

@LastBye En bref, essayez de limiter l'utilisation de votre conteneur à l'entrée de chaque module point. J'injecterai IUnityContainer dans le constructeur (implémentation) de votre IModule. Ensuite, enregistrez vos types et résolvez ses composants dans la méthode Initialize, au moins pour Unity. Habituellement, d'autres types que vous résolvez ou qui sont injectés dans d'autres types devraient pouvoir obtenir leurs dépendances injectées dans le constructeur. – Alan

Questions connexes