2010-03-31 14 views
5

Je travaille actuellement avec MEF, mais la réponse que je recherche n'est probablement pas pertinente pour MEF - c'est une injection de dépendance - j'utilise simplement la terminologie MEF comme exemple ici.Comment exporter et importer des services d'application avec say MEF?

histoire de fond court, j'ai lu cet article sur le site MSDN mettant l'accent sur Composite Applications

Sur cette figure, il y a trois choses, la coquille, les services d'application et les modules. C'est donc une application composite.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

Ce que je ne comprends pas pleinement est des services d'application partie. Quel est le service, à quoi cela ressemble-t-il? Comment exposer un service via un module et comment consommer un service d'un module différent? Je voudrais vraiment voir quelques exemples de petits codes, rien d'extraordinaire mais quelque chose pour illustrer comment tout cela prend vie (la partie des services d'application). Déclarer l'interface pour la classe de service et d'exportation implémentant cette interface.

+5

Mes yeux, MES YEUX! –

+0

Ouais, le choix des couleurs dans cette image est horrible ... –

Répondre

3

Les services d'application, en ce qui concerne MEF, ne sont qu'une autre partie composable. Toute interface ou classe que vous pouvez composer peut agir comme un service.

Chaque service aura une interface ou une classe de base que vous souhaitez implémenter. Vous pouvez les faire en masse via un type d'interface IService (et utiliser [ImportMany] pour les importer tous), mais souvent, vous aurez besoin de différents types de services.

Vous pouvez ensuite l'importer, selon vos besoins, dans vos classes. Par exemple, supposons que vous avez une bibliothèque d'interface commune pour les services, et vous fournir:

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

Vous pouvez alors une exportation de bibliothèque distincts types:

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

Votre programme principal serait alors en mesure de importez-le au besoin et écrivez le code contre. Par exemple, si vous souhaitez afficher des clients, vous devez charger les clients à partir de votre couche de données. Si vous voulez charger via votre dépôt, vous pouvez importer le dépôt dans une partie spécifique de votre application:

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

Vous souhaitez ensuite obtenir ce service composé directement dans votre application.

Ceci est considéré comme un "service d'application" car il s'agit d'une implémentation spécifique d'un service générique - ce n'est pas un composant lié à la vue, et il peut être utilisé dans toute votre application.

+0

Si plus d'un service d'application satisfait l'importation, comment distingueriez-vous les deux? métadonnées? ou y a-t-il un meilleur moyen? ou est-ce juste faux.Je sais que MEF jette une exception quand cela arrive, est-ce que je veux juste une interface et une implémentation concrète? –

+0

@John: Vous devez utiliser [ImportMany], puis interroger le service ou utiliser les métadonnées pour déterminer les éléments à utiliser. Sinon, vous obtenez une exception. –

+0

@John: Si plusieurs services utilisent la même interface/classe d'importation, utilisez [ImportMany] et importez-les dans un IEnumerable.

0

Par exemple, vous pouvez avoir IPersonBuilder, déclaré en assembly partagé. Votre module principal a MyPersonBuilder implémentant l'interface et exporte ceci. Toutes les vues utilisent les méthodes IPersonBuilder pour appeler la méthode, et en utilisant la composition MEF, elles pourront appeler CreatePerson() sur votre MyPersonBuilder à partir de votre module principal.