WPF avec l'Unité de Conteneur - Comment enregistrer et résoudre les ViewModels de Vues
Salut, je suis en train d'utiliser l'Unité de conteneur dans WPF MVVM application. Je n'ai pas utilisé Prisme car il me semble lourd. Voici la structure de l'application. Je suis à essayer de comprendre comment résoudre les points de Vue à Viewmodel et les dépendances de la vue des modèles (des services).
Application:
Vues
MainWindow.xaml
CustomerList.xaml
CustomerDetail.xaml
BookList.xaml
BookDetail.xaml
Viewmodel
MainViewModel
CustomerListViewModel
BoolListViewModel
BookDetailViewModel
CustomerDetailViewModel
Bibliothèque
ICustomerService (AddCustomer, SaveCustomer, GetCustomers, GetCustomer)
CustomerService:ICustomerService
IBookService (GetBooks, GetBook)
BookService:IBookService
IBookReserveService(Reserve, Return)
BookReserveService:IBookReserveService
- MainViewModel besoins de référence pour ICustomerService, et IBookService
- CustomerListViewModel besoins de référence pour ICustomerService
- BoolListViewModel besoins de référence pour IBookService
- BookDetailViewModel besoins de référence pour ICustomerService, et IBookReserveService
- CustomerDetailViewModel besoins de référence pour ICustomerService, et IBookReserveService
J'ai getter le setter de la propriété pour les services dans chaque viewmodel.
Je suis en cours d'exécution dans des questions sur comment puis-je utiliser l'Injection de Dépendance avec WPF, surtout pour les Vues et ViewModel. J'ai essayé avec l'Unité d'enregistrer et de les résoudre dans une application console qui fonctionne bien. Mais j'aimerais quelques idées sur la façon dont cela pourrait être fait pour application WPF. J'ai essayé l'enregistrement
container.RegisterType<ICustomerService, CustomerService>()
container.RegisterType<IBookReserveService, BookReserveService>()
container.RegisterType<IBookService, BookService>()
et de le résoudre à l'aide de
le conteneur.Resolve();
Mais je n'étais pas sûr de savoir comment je pourrais le dire à la vue qui doit utiliser la vue du modèle et de les résoudre quand il le faut et non pas lorsque l'application démarre. Aussi, je n'ai pas de résoudre tous les de la cartographie dans l'application de démarrage. Il doit être effectué lorsque le menu (Sélection d'un client pour visualiser le détail, la sélection d'un livre pour en voir le détail, enregistrer de la clientèle, de la réserve du livre etc.) est sélectionné.
Surtout ce que j'ai lu voulu utiliser IView et IViewModel. Mais pas sûr que j'ai compris l'avantage qu'elle procure.
Toute aide est grandement appréciée.
OriginalL'auteur isakavis | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
Voici une façon de le faire. Tout d'abord, enregistrez votre vue-des modèles et des services avec l'Unité comme ceci:
Deuxième, définissez votre point de vue du DataContext de la vue modèle dans la vue du constructeur comme suit:
Troisième, vous aurez besoin d'injecter de vos services dans votre champ de vision modèles:
Il y a d'autres façons de le faire à l'aide .les fichiers de configuration, etc. mais ce devrait vous donner assez pour commencer, laissez-moi savoir si vous avez besoin de plus. Vous avez demandé à ce que les avantages de la DI sont et ils sont nombreux, je le sens. Pour n'en nommer un couple: la promotion du libre-couplage entre vos composants et l'amélioration de la testabilité. Je pense que c'est l'un des pivot pour une bonne conception/mise en œuvre.
Mise à JOUR:
Avec Unity >=3, vous pouvez sauter le conteneur de l'enregistrement, si vous suivez la convention de nommage comme ceci:
L'unité sera de résoudre de lui-même, donc pas besoin de s'inscrire sur le récipient lui-même. J'ai mis à jour ma réponse pour répondre à votre question.
Parfait. Cela a fonctionné. J'ai aussi commencé à créer une catégorie distincte juste de s'inscrire et de résoudre les types de besoin, et j'ai fait de la statique au lieu de passer le conteneur tout autour. Pensez-vous que c'est une bonne approche?
Génial...Laissez l'Unité gérer le Résoudre<T) et je crois que l'Unité de conteneur est un singleton par défaut. Je ne voudrais pas créer une classe statique pour agir comme un wrapper parce que je ne vois aucun avantage à elle et qu'il ajoute inutile de météorisation (juste mon avis). Si vous avez le temps, de la recherche Prism comme il facilite le pattern MVVM.
Pourquoi avez-vous
_container.Resolve<IMainViewModel>();
ConstructorInjection/PropertyInjection?OriginalL'auteur Big Daddy