Alors, pour commencer je précise que je ne suis absolument pas un expert en matière d'IoC, c'est une pratique que je n'ai adoptée que récemment.
En gros, j'utilise un conteneur IoC pour tout ce qui est "services" : des classes dont il existe une seule instance (singleton), qui ont des dépendances entre elles, et dont j'aurai besoin pour toute la durée de vie de l'application.
Par exemple, CommunicationService dépend de ISettingsProvider et éventuellement de quelques autres services, mais pas de données variables, donc le conteneur IoC est bien adapté. L'intérêt est que si je rajoute une dépendance sur un service qui est déjà enregistré auprès du conteneur, j'ai juste à ajouter un paramètre au constructeur, et ça marche tout seul sans avoir à changer autre chose.
Par contre, ça ne convient pas à tous les scénarios : parfois j'ai besoin de créer des instances de classes dynamiquement, en leur passant des paramètres qui sont variables. Je pourrais passer les dépendances explicitement au constructeur, mais ce serait un peu galère, parce qu'il faudrait alors que le code qui crée l'instance ait aussi ces dépendances. Par exemple, si j'ai une classe AlbumViewModel avec un constructeur comme ça :
public AlbumViewModel(Album album, IThumbnailProvider thumbnailProvider)
Je ne voudrais pas que la classe AlbumCollectionViewModel qui va instancier des AlbumViewModel ait une dépendance sur IThumbnailProvider, alors qu'elle n'en a pas besoin elle-même...
Dans ce cas là, je crée une factory, qui est enregistrée dans le conteneur IoC et a ses propres dépendances :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class AlbumViewModelFactory
{
private readonly IThumbnailProvider _thumbnailProvider;
public AlbumViewModelFactory(IThumbnailProvider thumbnailProvider)
{
_thumbnailProvider = thumbnailProvider;
}
public AlbumViewModel Create(Album album)
{
return new AlbumViewModelFactory(album, _thumbnailProvider);
}
} |
Maintenant AlbumCollectionViewModel a juste besoin d'une dépendance sur AlbumViewModelFactory, et si j'ajoute de nouvelles dépendances, je les ajoute juste à la factory, pas à AlbumCollectionViewModel...
Pour ma part il me semble plus pratique de le faire manuellement en injectant les dependances au constructeur que d'avoir à configuerer un Fwk dans le global.asax.
Bah ça dépend si la conf du conteneur IoC est complexe ou non... Dans mes projets XAML, j'utilise un petit conteneur très simple (il s'appelle d'ailleurs SimpleIoc) inclus dans la lib MvvmLight. La conf est simplissime ; l'enregistrement d'un service via son interface se résume à ça :
SimpleIoc.Default.Register<IThumbnailProvider, ThumbnailProvider>();
Et s'il n'y a pas d'interface, c'est encore plus simple :
SimpleIoc.Default.Register<AlbumViewModelFactory>();
Donc bon, c'est vraiment pas trop lourd, au vu du temps que ça me fait gagner par la suite...
Partager