9
votes

Pouvez-vous hydrater une propriété statique à l'aide de MEF?

Puis-je hydrater cela dans le constructeur statique de la classe? XXX


5 commentaires

"HYDRATE" est un terme d'hibernate qui signifie désérialisaliser, c'est-à-dire de convertir les données dans un objet de domaine. Voulez-vous dire "initialiser" à la place?


@WIM - Je l'ai pris pour signifier remplir une classe avec ses valeurs.


@WIM - Pouvez-vous relier les ressources qui désignent l'hydratation doivent être désérialisantes? Je ne vois pas beaucoup sur Google qui ne semble pas adapté à ma définition.


Google.com/search?q=hydrate+Object


La liaison numéro 1 parle d'hydratation d'un dB. Les 3 sur les 4 prochains liens parlent de «hydrater des autres sources» ou ne disent rien d'un type de source. Avez-vous regardé les résultats de votre recherche ou viennent de lier quelque chose?


3 Réponses :


15
votes

Non, Mef ne prend pas en charge les importations statiques.


6 commentaires

+1 Tirer une valeur d'un conteneur et la farcissement dans une propriété statique n'est pas une importation. L'ensemble du point d'utilisation d'un conteneur est qu'il s'occupe de l'injection de dépendances automatiquement. Si vous allez faire cela vous-même, vous pourriez aussi bien jeter le conteneur. Réutilisable, Unité testable, un code couplé de manière lâche doit éviter les membres statiques. Les membres statiques collent tout ensemble dans une grande boule de boue.


@WIM - Visual Studio appelle une importation, il n'y a pas de références au code qui fournit le plugin et la composition fonctionne. Juste parce que l'utilisation d'une statique dans certaines situations est une mauvaise pratique ne signifie pas que ce n'est pas du MEF. De plus, j'ai Typemock, les membres statiques sont testables de l'unité. Alors qu'est-ce que tu essayes de dire ici?


@ Maslow L'attribut d'importation que vous mettez sur le membre statique ne fait rien. Vous pouvez supprimer cet attribut et votre code fonctionnerait de la même manière. C'est pourquoi nous ne considérons pas cela une importation.


@Daniel - OK ... donc quel terme dois-je utiliser? Et comment l'importation est-elle censée fonctionner? Mon objectif était d'hydrater une propriété statique avec Mef et je l'ai atteint. Quels détails techniques / formulation que je manque dans ma question pour que cela soit clair?


@WIM - Ma question portait sur peupler une propriété à ne pas "importer". Nous utilisons donc un attribut d'importation de manière incorrecte n'est pas pertinent pour la question. Votre +1 à la réponse qui dit est encore petite et off-sujet.


@Aslow Vous devez avoir une instance de exportProvider ou compositionContainer pour faire ce que vous avez fait. Si vous écrivez, dites, une extension de MEF pour Visual Studio, il n'est pas possible d'obtenir une instance exportProvider , afin que vous ne puissiez pas appeler getExportedvalue .



1
votes

C'était plus facile que ce que je pensais que ce serait.

 static Connect()
    {
        var batch = new CompositionBatch( );
        CompositionContainer container;
        var reflectionCatalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly( ));

        var extensionPath = System.IO.Path.Combine(Environment.CurrentDirectory, "extensions");
        if (System.IO.Directory.Exists(extensionPath))
        {
            var directoryCatalog = new DirectoryCatalog(extensionPath);
            var defaultCatalogEp = new CatalogExportProvider(reflectionCatalog);
            container=new CompositionContainer(directoryCatalog, defaultCatalogEp);
            defaultCatalogEp.SourceProvider=container;
        }
        else
            container = new CompositionContainer(reflectionCatalog);

        container.Compose(batch);
 //Setting a static property
        Display=container.GetExportedValue<Action<IEnumerable< ProjectLogicChecks>>>( );
    }


1 commentaires

C'est une solution laide. En utilisant Mef, vous ne devriez pas avoir besoin de choses statiques. Vous pouvez simplement importer quelque chose avec une stratégie de création de pièces de partagée et se comporte comme statique.



2
votes

Vous pouvez utiliser [ImportingConstructor] et définir la propriété statique dans le constructeur. XXX

Ne le réglez pas dans un champ statique.


0 commentaires