2013-02-18 4 views
2

J'essaie de remplacer le comportement Unity Container par défaut pour la bibliothèque d'entreprise afin que je puisse utiliser mon conteneur MEF. Il y a peu de ressources avec des explications sur la façon de faire cela, mais je ne suis pas l'obtenir:Utilisation de MEF avec la bibliothèque d'entreprise

Il y a aussi ce message sur le SO, mais le code ne compile pas car LogWriter est protégé. Je suppose que cela fait référence à une ancienne version:

Ce que je comprends est que je dois utiliser le CommonServiceLocator pour mon conteneur puis attacher MEF ce au conteneur Enterprise Library. Voici ce que j'ai pour mon configurateur de conteneurs:

public class MefContainerConfigurator : IContainerConfigurator, IServiceLocator 
{ 
    [Import] private CatalogExportProvider provider; 

    public object GetService(Type serviceType) 
    { 
      throw new NotImplementedException(); 
    } 

    public object GetInstance(Type serviceType) 
    { 
     return provider.GetExportedValue<Type>(); 
    } 

    public object GetInstance(Type serviceType, string key) 
    { 
     throw new NotImplementedException(); 
    } 

    public IEnumerable<object> GetAllInstances(Type serviceType) 
    { 
     throw new NotImplementedException(); 
    } 

    public TService GetInstance<TService>() 
    { 
     return provider.GetExportedValue<TService>(); 
    } 

    public TService GetInstance<TService>(string key) 
    { 
     return provider.GetExportedValue<TService>(key); 
    } 

    public IEnumerable<TService> GetAllInstances<TService>() 
    { 
     return provider.GetExportedValues<TService>(); 
    } 

    public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Et dans mon bootstrapper:

var configurator = new MefContainerConfigurator(); 
// Does this line read the Enterprise Library configuration from the app.config? 
IConfigurationSource cs = new SystemConfigurationSource(); 

EnterpriseLibraryContainer.ConfigureContainer(configurator, cs); 

Je pense peut-être que je dois utiliser des LogWriterImpl et ExceptionManagerImpl les classes que ceux-ci ont des constructeurs qui configuration acceptent. Mes questions à ce stade seraient:

  • Comment puis-je récupérer la configuration du IConfigurationSource et se nourrissent dans les constructeurs pour les LogWriterImpl et ExceptionManagerImpl constructeurs?
  • EnterpriseLibraryContainer.ConfigureContainer appelle RegisterAll dans MefContainerConfigurator. Est-ce là où je suis censé enregistrer tous les types de bibliothèques d'entreprise dans le conteneur?
  • Les méthodes de l'interface IServiceLocator que j'ai laissé comme NonImplemented; Je ne pouvais pas trouver un moyen de les utiliser pour renvoyer des objets de mon conteneur. Suis-je censé les laisser comme n'étant pas mis en œuvre et utiliser les méthodes génériques à la place?

Modifier

Je ne peux pas obtenir ce tout à fait raison. Basé sur la réponse de @Chris Tavares, j'ai écrit ma méthode RegisterAll dans le MefContainerConfigurator pour parcourir les TypeRegistrations et les ajouter à un conteneur. Je ne peux pas pour la vie de me comprendre comment fusionner ces à mon AggregateContainer qui est créé dans ma classe Bootstrapper pour que je puisse réellement utiliser ces exportations en dehors de la ContainerConfigurator:

public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider) 
{ 
    var registrations = rootProvider.GetRegistrations(configurationSource); 

    foreach (var type in registrations) 
    { 
     var builder = new RegistrationBuilder(); 

     builder.ForType(type.ServiceType).Export(); 

     var cat = new AssemblyCatalog(type.ServiceType.Assembly, builder); 
     var container = new CompositionContainer(cat); 
     container.ComposeParts(this); 
    } 
} 

ConfigureAggregateCatalog dans Prism bootstrapper:

protected override void ConfigureAggregateCatalog() 
{ 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(RegionNames).Assembly)); 
    // Module assemblies 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DataEntryModule).Assembly)); 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ReportingModule).Assembly)); 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StatusBarModule).Assembly)); 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(SplashScreenModule).Assembly)); 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(WelcomeModule).Assembly)); 
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(AdministrationModule).Assembly)); 

    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly)); 
} 

Répondre

1

Votre configurateur de conteneur est terriblement incomplet. Vous avez une méthode à implémenter: RegisterAll, et vous ne l'avez pas implémentée.

Vous n'avez pas besoin de lire les informations de configuration brutes de config; Au lieu de cela, lorsque vous appelez EnterpriseLibraryContianer.ConfigureContainer, Entlib parcourt la source de configuration, sélectionne tous les bits importants et vous remet une série d'objets TypeRegistration. Ces gars vous donnent les mappages de type, les dépendances du constructeur, etc. Tout ce dont vous avez besoin pour enregistrer les dépendances dans votre conteneur (dans ce cas, MEF).

Donc, fondamentalement, ce que vous devez faire est d'écrire le code qui transforme l'objet TypeRegistration abstrait dans la bonne configuration pour MEF.

L'unité n'est pas spéciale à cet égard; il a aussi un configurateur et suit exactement le même processus, de sorte que vous pouvez regarder dans le code entlib comme un exemple du genre de choses que vous devrez faire.

Je ne connais pas du tout les API du MEF, donc je ne peux malheureusement pas vous aider avec une implémentation spécifique.

+0

Merci, cela m'a orienté dans la bonne direction pour la méthode RegisterAll. Voir mon édition pour le problème révisé, bien que je ne pense pas que vous serez en mesure d'aider car c'est maintenant MEF spécifique. – ChrisO

Questions connexes