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
- http://blogs.msdn.com/b/bobbrum/archive/2009/06/23/enterprise-library-5-0-some-architecture-changes.aspx
- http://entlib.uservoice.com/forums/90505-silverlight-integration-pack/suggestions/1284693-mef-configurator-for-enterprise-library-container
- http://entlib.codeplex.com/discussions/261443
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 lesLogWriterImpl
etExceptionManagerImpl
constructeurs? EnterpriseLibraryContainer.ConfigureContainer
appelleRegisterAll
dansMefContainerConfigurator
. 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));
}
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