7
votes

Système de module Prism depuis le service de WCF?

Pouvez-vous boostrap un système de module de prisme à partir du service WCF? Parce que peu importe ce que je fais, mes dépendances de MEF ne sont pas remplies.

par exemple: p>

Ceci est mon Service WCF Strong> Mise en œuvre P>

[ModuleExport(typeof(DatabaseImpl), DependsOnModuleNames = new string[] { "IDatabase" })]
public class ModuleActivator : IModule
{
    public void Initialize()
    {
        // Do nothing as this is a library module.
    }
}

[Export(typeof(IDatabase))]
public class DatabaseImpl : IDatabase
{
   /// implementation here ...
}


5 commentaires

Alors, qu'en est-il des progrès sur cette question?


Je pense avoir trouvé une solution dans le livre "Injection de dépendance dans .NET" (partie 3, ch. 7.3). Toujours le tester. Fondamentalement, il s'agit simplement d'accrocher dans la routine de démarrage de la WCF.


Comme je l'ai dit dans mon commentaire. Je pense vraiment que c'est un problème de configuration de votre conteneur et de régiser les types ...


Puis-je demander pourquoi vous utilisez prisme? Selon la documentation Prism fournit des conseils à la mise en œuvre d'interfaces utilisateur riches sur le client. Je comprends que vous souhaitiez peut-être composer votre instance de service à l'aide d'un conteneur di conteneur - mais pas sûr de la raison pour laquelle vous souhaitez le faire en utilisant Prism. Voulez-vous vraiment une référence à WindowsBase dans votre assemblée qui définit votre service?


Leur libellé ici, vers le début de la page "même Les projets individuels peuvent réaliser les avantages en créant des applications plus testables et de maintenabilité qui peuvent évoluer au fil du temps à l'approche modulaire " m'a fait penser que le prisme pourrait être utilisé comme système de module. Je pense que je commence à comprendre que ce n'est pas vraiment aussi générique que je pensais.


3 Réponses :


1
votes

Je ne suis pas sûr que les extraits suivants vous aideront. Je n'ai que l'expérience du prisme et de l'unité. Essayez-le et dites-moi ce qui se passe.

protected override void ConfigureModuleCatalog()
        {

            base.ConfigureModuleCatalog();

            var moduleCatalog = (ModuleCatalog)ModuleCatalog;

            Type Initial = typeof(ModuleActivator);
            moduleCatalog.AddModule(new ModuleInfo
            {
                ModuleName = Initial.Name,
                ModuleType = Initial.AssemblyQualifiedName
            });
        }


0 commentaires

3
votes

Vous n'aurez rien importé dans votre champ dB code> car l'objet myservice code> n'est pas créé par le conteneur - il ne peut pas être créé par celui-ci car le conteneur est en fait être créé dans la bootstrapper, qui est dans constructeur de myservice code>.

Un moyen simple de résoudre ce problème est de satisfaire les importations de votre objet après l'initialisation du conteneur. Pour ce faire, vous pouvez exposer le conteneur dans la bootstrapper, comme: P> xxx pré>

puis modifier msservice code> constructeur de services: p>

public MyService()
{
    var bootsrapper = new MyServiceBoostrapper();
    bootsrapper.Run();

    // This is an extension method. You'll need to add
    // System.ComponentModel.Composition to your using statements.
    bootstrapper.MyServiceContainer.SatisfyImportsOnce(this);

    // At this stage, "db" should not be null.
}


2 commentaires

Oui ça marche. Merci. Bien sûr, la chose est que je n'ai même pas besoin de prisme. C'était juste confondre la question. En outre, la lecture de l'injection de dépendance dans .NET Le livre a permis de clarifier ce qui a été fait où. Surtout leur exemple de comment bootstrap wcf. Je suis trop fatigué aujourd'hui pour écrire cette réponse ici, mais ce serait la bonne façon de bootstrap un service WCF.


Ouais, Prism n'est probablement pas nécessaire ici, mais je pensais expliquer pourquoi les choses qui ne fonctionnaient pas vous aideraient à mieux décider de la manière de bootstrap de votre service tout en vous permettant de conserver votre mise en œuvre actuelle. Quoi qu'il en soit, j'espère que ma réponse était d'une aide.



0
votes

Eh bien, il semble que la solution ne soit pas utilisée du tout prisme, car elle n'ajoute rien de "modulaire" avec ses modules. Il semble que les modules soient des concepts purement pour les applications visuelles.

Au lieu de cela, il faut accrocher dans la procédure de «démarrage» de la WCF et boostrap le conteneur de MEF à partir de là. La réponse sur la manière de faire cela est plutôt impliquée (bien que non compliquée), car WCF a déjà plusieurs points d'extension / crochet.

La réponse que j'ai utilisée est utilisée dans le livre Injection de dépendance dans .NET par Mark Semelann au chapitre 7.3: "Composer des applications WCF".

Short de copier tout le chapitre de ce livre dans cette réponse, j'ai peur que ce soit le meilleur que je puisse faire.


0 commentaires