Pourquoi ne pas utiliser les deux, ainsi on pourrait facilement intégrer des modules avec Unity ou avec MEF.
Littérature de référence
Sur le sujet de l'utilisation de Prism de Unity et de MEF on trouve la littérature suivante :Wilfried Woiwré :
http://blog.woivre.fr/Archives/2010/3/allier-mef-et-unity
De très bonnes explications, en français. Puis il renvoie sur le projet de référence sur ce sujet de l'utilisation de Unity et de MEF le MEFContrib du CodePlex
Comprendre l'utilisation de MEF puis MEF à travers IoC :
Article.MEFContrib
Etape 3 - MEF + Factory + Unity :
Remarque : Et oui le flux RSS de Wilfried demande une authentification ...
Piotr Wlodek
http://pwlodek.blogspot.fr/2009/05/unity-mef-integration-layer.html
http://pwlodek.blogspot.fr/2009/08/improved-mef-unity-integration-layer.html
Toute cette littérature est indispensable à la compréhension de l'utilisation de MEF et de Unity et ramène vers le projet du CodePlex : MEFContrib
Et cela ne fonctionne plus :
Dans la version v1.2 :
namespace Microsoft.Practices.Unity
{
public abstract class ExtensionContext
{
protected ExtensionContext();
public abstract StagedStrategyChain<UnityBuildStage> BuildPlanStrategies { get; }
public abstract IUnityContainer Container { get; }
public abstract ILifetimeContainer Lifetime { get; }
public abstract IReadWriteLocator Locator { get; }
public abstract IPolicyList Policies { get; }
public abstract StagedStrategyChain<UnityBuildStage> Strategies { get; }
public abstract event EventHandler<RegisterEventArgs> Registering;
public abstract event EventHandler<RegisterInstanceEventArgs> RegisteringInstance;
public abstract void RegisterNamedType(Type t, string name);
}
}
Dans la version v2.1.505 :
namespace Microsoft.Practices.Unity
{
public abstract class ExtensionContext
{
protected ExtensionContext();
public abstract StagedStrategyChain<UnityBuildStage> BuildPlanStrategies { get; }
public abstract IUnityContainer Container { get; }
public abstract ILifetimeContainer Lifetime { get; }
public abstract IPolicyList Policies { get; }
public abstract StagedStrategyChain<UnityBuildStage> Strategies { get; }
public abstract event EventHandler<ChildContainerCreatedEventArgs> ChildContainerCreated;
public abstract event EventHandler<RegisterEventArgs> Registering;
public abstract event EventHandler<RegisterInstanceEventArgs> RegisteringInstance;
public abstract void RegisterNamedType(Type t, string name);
}
}
On remarquera que l'objet Locator a disparut c'est balo non ... ?
En récupérant les sources de Article.MEFContrib je me retrouve avec le projet suivant :
Dont les références sont les suivantes :
Je ne peux pas encore compiler car mon BootStrapper.cs comprend le code suivant :
public class BootStrapper : UnityBootstrapper
{
public CompositionContainer MefContainer { get; private set; }
protected override IUnityContainer CreateContainer()
{
var aggregateCatalog = new AggregateCatalog(new ComposablePartCatalog[] { new DirectoryCatalog(@".\Extensions") });
var unityContainer = new UnityContainer();
MefContainer = unityContainer.RegisterFallbackCatalog(aggregateCatalog);
return unityContainer;
}
La fonction RegisterFallbackCatalog est définie dans la Class UnityContainerExtensions que j'ai pourtant intégrée dans mon projet !?
using MefContrib.Integration.Unity;
using MefContrib.Integration.Unity.Exporters;
using MefContrib.Integration.Unity.Extensions;
using Microsoft.Practices.Unity;
namespace WpfMvvmApplicationPrimsNuGet.Extensions
{
public static class UnityContainerExtensions
{
public static CompositionContainer RegisterFallbackCatalog(this IUnityContainer unityContainer, ComposablePartCatalog catalog)
{
lock(unityContainer)
{
var compositionIntegration = GetOrInitCompositionIntegration(unityContainer);
compositionIntegration.Catalogs.Add(catalog);
return compositionIntegration.CompositionContainer;
}
}
J'ai bien les using qui conviennent vers les packages que j'ai installés grâce à NuGet mais quand je regarde à l'intérieur grâce à l'Object Browser c'est la stupeur !
D'un côté dans le projet Article.MEFContrib j'ai :
Tandis que dans le projet que je viens de créer :
Ce qui n'est sensiblement pas le même contenu !
Il va donc falloir que je reprenne les exemples utilisant le MEFContrib installé par les NuGet packages afin de pouvoir enfin intégrer l'utilisation de MEF ET Unity dans mon propre projet.
Vous avez une idée quelque chose de plus simple, n'hésitez pas à m'en faire part.
De très bonnes explications, en français. Puis il renvoie sur le projet de référence sur ce sujet de l'utilisation de Unity et de MEF le MEFContrib du CodePlex
Comprendre l'utilisation de MEF puis MEF à travers IoC :
Article.MEFContrib
Etape 3 - MEF + Factory + Unity :
Utilisation de MEFContrib intégration de Unity et MEF |
Piotr Wlodek
http://pwlodek.blogspot.fr/2009/05/unity-mef-integration-layer.html
http://pwlodek.blogspot.fr/2009/08/improved-mef-unity-integration-layer.html
Toute cette littérature est indispensable à la compréhension de l'utilisation de MEF et de Unity et ramène vers le projet du CodePlex : MEFContrib
Prism version v4.1
Oui le projet Article.MEFContrib - Etape 3 - MEF + Factory + Unity : est livré avec un répertoire \Shared Binairies la version de la DLL Microsoft.Practices.Unity.dll est v1.2.0.0 mais j'aimerais utiliser la version de Prism v4.1 et donc la version v2.1.505 de Microsoft.Practices.Unity.dllEt cela ne fonctionne plus :
Dans la version v1.2 :
namespace Microsoft.Practices.Unity
{
public abstract class ExtensionContext
{
protected ExtensionContext();
public abstract StagedStrategyChain<UnityBuildStage> BuildPlanStrategies { get; }
public abstract IUnityContainer Container { get; }
public abstract ILifetimeContainer Lifetime { get; }
public abstract IReadWriteLocator Locator { get; }
public abstract IPolicyList Policies { get; }
public abstract StagedStrategyChain<UnityBuildStage> Strategies { get; }
public abstract event EventHandler<RegisterEventArgs> Registering;
public abstract event EventHandler<RegisterInstanceEventArgs> RegisteringInstance;
public abstract void RegisterNamedType(Type t, string name);
}
}
Dans la version v2.1.505 :
namespace Microsoft.Practices.Unity
{
public abstract class ExtensionContext
{
protected ExtensionContext();
public abstract StagedStrategyChain<UnityBuildStage> BuildPlanStrategies { get; }
public abstract IUnityContainer Container { get; }
public abstract ILifetimeContainer Lifetime { get; }
public abstract IPolicyList Policies { get; }
public abstract StagedStrategyChain<UnityBuildStage> Strategies { get; }
public abstract event EventHandler<ChildContainerCreatedEventArgs> ChildContainerCreated;
public abstract event EventHandler<RegisterEventArgs> Registering;
public abstract event EventHandler<RegisterInstanceEventArgs> RegisteringInstance;
public abstract void RegisterNamedType(Type t, string name);
}
}
On remarquera que l'objet Locator a disparut c'est balo non ... ?
MEF Contrib et .NET Framework 4.0
J'investigue pour comprendre pourquoi je ne peux pas utiliser MEF Contrib avec le framework 4.0 et Prism v4.1. Je créé un nouveau projet dans une nouvelle solution à l'aide du template :
Création d'un solution WPF MVVM Application |
Et puis j'ai remarqué que l'on peut installer le package MefContrib.1.2.2.1 grâce à NuGet. J'installe donc l'ensemble de packages suivants :
Prism.4.1.0.0
Prism.MEFExtensions.4.1.0.0
CommonServiceLocator.1.0
MefContrib.1.2.2.1
MefContrib.Integration.Unity.1.2.2.1
Prism.MEFExtensions.4.1.0.0
Prism.UnityExtensions.4.1.0.0
Unity.2.1.505.2
En récupérant les sources de Article.MEFContrib je me retrouve avec le projet suivant :
Mon Application WPF MVVM avec les sources de Article.MEFContrib |
Les références du projet WPF MWW Application with Prism and MEFContrib |
public class BootStrapper : UnityBootstrapper
{
public CompositionContainer MefContainer { get; private set; }
protected override IUnityContainer CreateContainer()
{
var aggregateCatalog = new AggregateCatalog(new ComposablePartCatalog[] { new DirectoryCatalog(@".\Extensions") });
var unityContainer = new UnityContainer();
MefContainer = unityContainer.RegisterFallbackCatalog(aggregateCatalog);
return unityContainer;
}
La fonction RegisterFallbackCatalog est définie dans la Class UnityContainerExtensions que j'ai pourtant intégrée dans mon projet !?
using MefContrib.Integration.Unity;
using MefContrib.Integration.Unity.Exporters;
using MefContrib.Integration.Unity.Extensions;
using Microsoft.Practices.Unity;
namespace WpfMvvmApplicationPrimsNuGet.Extensions
{
public static class UnityContainerExtensions
{
public static CompositionContainer RegisterFallbackCatalog(this IUnityContainer unityContainer, ComposablePartCatalog catalog)
{
lock(unityContainer)
{
var compositionIntegration = GetOrInitCompositionIntegration(unityContainer);
compositionIntegration.Catalogs.Add(catalog);
return compositionIntegration.CompositionContainer;
}
}
J'ai bien les using qui conviennent vers les packages que j'ai installés grâce à NuGet mais quand je regarde à l'intérieur grâce à l'Object Browser c'est la stupeur !
D'un côté dans le projet Article.MEFContrib j'ai :
A l'intérieur du package MefContrib.Integration.Unit du projet Article.MEFcontrib |
A l'intérieur du package MefContrib.Integration.Unit du projet Article.MEFcontrib |
Conclusion sur le projet Article.MEFContrib
Personnellement je ne comprends pas l'erreur que j'ai commise. J'en déduis que le projet Article.MEFContrib utilise ses propres codes sources de "MEFContrib" et n'est pas compatible avec les packages MEFContrib installés par NuGet.Il va donc falloir que je reprenne les exemples utilisant le MEFContrib installé par les NuGet packages afin de pouvoir enfin intégrer l'utilisation de MEF ET Unity dans mon propre projet.
Vous avez une idée quelque chose de plus simple, n'hésitez pas à m'en faire part.
Aucun commentaire:
Enregistrer un commentaire
Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.