2009-02-05 2 views

Répondre

13

J'ai utilisé ServiceLocator en combinaison avec MVVM pour activer la liaison déclarative de View à ViewModel.

Le ServiceLocator est basé sur le pull alors que les conteneurs IoC sont basés sur le push. Par exemple:

Si vous utilisez un conteneur IoC vous allez créer probablement quelque chose comme ceci:

public MyViewModel(IDataRepository repository) 
{ 
} 

Le conteneur IoC poussera l'instance IDataRepository dans l'objet tout en construisant.

Si vous utilisez un ServiceLocator vous généralement écrire du code comme ceci:

public MyViewModel() 
{ 
    _repository = ServiceLocator.Instance.DataRepository; 
} 

Donc, dans ce cas, le ViewModel tire une instance de l'interface IDataRepository du ServiceLocator.

Le ServiceLocator peut être pris en charge par un conteneur IoC (mais pas nécessaire). L'avantage de cela est que vous pouvez ajouter le ServiceLocator en tant que ressource à votre fichier App.xaml, puis y accéder de manière déclarative à partir des vues.

<UserControl 
    DataContext="{Binding Path=MyViewModel, 
        Source={StaticResource serviceLocator}}">...</UserControl> 

Le MyViewModel peut être créé par un conteneur IoC, mais il est tiré dans la vue en utilisant la liaison de données et un ServiceLocator. Je possède un blog post about Dependency Injection, IoC and ServiceLocators in a Silverlihgt/MVVM context sur mon blog.

+1

> Le lien du blog ne fonctionne pas; peut vouloir vérifier le lien. – atconway

+0

J'ai mis à jour le lien vers l'article en question :) –

1

Le localisateur de service est un modèle de conception similaire à l'injection de dépendance.

Il permet à un consommateur de programmer sur une interface plutôt que sur une classe concrète.

Jetez un oeil à la Common Service Locator hébergé chez CodePlex.

Questions connexes