Prism Modularité avec MEF et Unity

Recherchant à utiliser Prism pour son modèle MVVM (et ce n'est peut être pas le meilleure idée que j'ai eu ...), et continuant mes investigations, je trouve des exemples de modularité avec Unity et d'autres avec MEF (Managed Extensibility Framework). Je passe sur la genèse mais il s'en est passé du temps avant l'intégration des frameworks Unity et MEF dans Prism.

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 :

Utilisation de MEFContrib intégration de Unity et MEF
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

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.dll

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 ... ?

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
Dont les références sont les suivantes :
Les références du projet WPF MWW Application with Prism and  MEFContrib
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 :
A l'intérieur du package MefContrib.Integration.Unit du projet Article.MEFcontrib
Tandis que dans le projet que je viens de créer :
A l'intérieur du package MefContrib.Integration.Unit du projet Article.MEFcontrib
Ce qui n'est sensiblement pas le même contenu !

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:

Publier un commentaire

Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.