[Xamarin] Injection de dépendances avec MvvmCross
Comme son nom l’indique, MvvmCross est un Framework MVVM qui se veut cross-plateforme. Ainsi, il fonctionne aussi bien sur Windows 8, Windows Phone, WPF mais également sur iOS et Android!
Une des fonctionnalité offerte par MvvmCross est la mise à disposition d’un petit container IoC, qui permet de faire de l’injection de dépendances entre les différents éléments (View, ViewModel, etc.) d’une application.
La première étape, dans le cadre de l’utilisation de cette fonctionnalité, consiste à enregistrer les éléments au sein du container. Vous pouvez, pour cela, utiliser la méthode Mvx.RegisterType:
Mvx.RegisterType<IDataAccessLayerService, DataAccessLayerService>();
Cependant, MvvmCross permet, en utilisation la reflexion, d’utiliser une syntaxe dite “fluent” pour enregistrer automatiquement au sein du container, des types qui correspondent à ce que l’on recherche. Ainsi, si le développeur veut enregister, sous forme de singleton, tous les types qui se termine par le mot “Service”:
this.CreatableTypes() .EndingWith("Service") .AsInterfaces() .RegisterAsLazySingleton();
Un grand nombre de méthodes d’extensions sont disponibles (par exemple pour rechercher les types qui possèdent un attribut spécifique, les types dont le nom contient une chaîne de caractères, etc.):
Une fois les types enregistrés dans le container, ils sont accessibles automatiquement dans vos différents ViewModels. Ainsi, vous pouvez utiliser la méthode Mvx.Resolve:
var dataAccessLayerService = Mvx.Resolve<IDataAccessLayerService>();
Où, si votre souhait est de récupérer une instance d’un type depuis un ViewModel, vous pouvez profiter du fait que les types sont injectés dans les constructeurs:
private readonly IDataAccessLayerService _dataAccessLayer; public HomeViewModel(IDataAccessLayerService dataAccessLayer) { this._dataAccessLayer = dataAccessLayer; }
Le système est simple mais se révèle terriblement puissant et efficace!
Happy coding!
Commentaires