2013-05-24 7 views
7

Können Sie ein Prism-Modulsystem vom WCF-Service aus boosten? Denn egal was ich mache, meine MEF Abhängigkeiten werden nicht erfüllt.Prism-Modul-System aus WCF-Service?

ZB:

Das ist mein WCF-Dienst Implementierung

public class MyService : IMyServiceContract{ 
    // This should get filled by MEF after Prism loads the required modules 
    [Import] 
    IDatabase db; 

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

Das ist mein Prism boostrapper mit MEF Geschmack:

public class MyServiceBoostrapper : MefBootstrapper 
{ 
    protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 
    } 

    protected override IModuleCatalog CreateModuleCatalog() 
    { 
     return new ConfigurationModuleCatalog(); 
    } 
    protected override void ConfigureAggregateCatalog() 
    { 
     base.ConfigureAggregateCatalog(); 

     // TODO: Add this assembly ... don't know why 
     this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyServiceBoostrapper).Assembly)); 
     this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(IDatabase).Assembly)); 
     // This is what provides the service 
     this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DatabaseImpl).Assembly)); 
    } 

    protected override DependencyObject CreateShell() 
    { 
     // we don't need the shell 
     return null; 
    } 

} 

Hier mein Modul ist dass enthält die Schnittstellen für Datenbank Prism Service:

[ModuleExport(typeof(IDatabase))] 
public class ModuleActivator : IModule 
{ 
    public void Initialize() 
    { 
     // Do nothing as this module simply provides the API. 
    } 
} 
public interface IDatabase 
{ 
    // interface methods here ... 
} 

und schließlich ist hier der Prism-Datenbank-Dienst selbst:

[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 ... 
} 

für die letzten paar Stunden versucht, dies ohne Erfolg. Mein db Import ist immer null und wird nie initialisiert.

Beachten Sie, dass alles funktioniert, wenn ich das alles ohne Prisma mache, aber nur mit MEF.

+0

Also, was ist mit den Fortschritten zu diesem Thema? –

+0

Ich glaube, ich habe im Buch "Dependency Injection in .NET" (Teil 3, Kap. 7.3) eine Lösung gefunden. Testen Sie es noch. Im Grunde genommen ist es nur eine Frage des Einstiegs in die WCF-Startroutine. – drozzy

+0

Wie ich in meinem Kommentar gesagt habe. Ich denke wirklich, es ist ein Problem der Konfiguration Ihres Containers und der Registrierung der Typen ... –

Antwort

0

Nun, wie es scheint, die Lösung nicht Prism zu verwenden ist überhaupt , da es mit seinen Modulen nichts "Modulares" hinzufügt. Es scheint, als wären die Module Konzepte rein für visuelle Anwendungen.

Stattdessen muss man sich in den WCF "Start" -Prozess einklinken und den MEF-Container von dort boosten. Die Antwort darauf ist ziemlich kompliziert (obwohl nicht kompliziert), da WCF bereits viele Extension-/Hook-In-Punkte hat.

Die Antwort, die ich verwendete, liegt in dem Buch Dependency Injection in .NET von Mark Seemann in Kapitel 7.3: "Composing WCF-Anwendungen".

Ohne das gesamte Kapitel aus diesem Buch in diese Antwort kopieren, fürchte ich, das ist das Beste, was ich tun kann.

1

Ich bin mir nicht sicher, ob die folgenden Snippets Ihnen helfen werden. Ich habe nur Erfahrung mit PRISM und Unity. Probieren Sie es einfach aus und erzählen Sie mir, was passiert.

protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 

     this.RegisterTypeIfMissing(typeof(IDatabase), typeof(DatabaseImpl), true); 
    } 

Sie erstellen und leeren auch ModuleCatalog und konfigurieren es nie.

protected override void ConfigureModuleCatalog() 
     { 

      base.ConfigureModuleCatalog(); 

      var moduleCatalog = (ModuleCatalog)ModuleCatalog; 

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

Sie werden nicht auf Ihr db Feld etwas importiert haben, weil das MyService Objekt durch den Behälter nicht erstellt wird - es ist nicht von ihm geschaffen werden kann, weil der Behälter tatsächlich in dem Bootstrap-Programm erstellt werden, das ist in MyService 's Konstruktor.

Eine einfache Möglichkeit, dies zu lösen, besteht darin, die Importe Ihres Objekts zu erfüllen, nachdem der Container initialisiert wurde. Dazu können Sie den Container in dem Bootstrap-Programm aussetzen etwa so:

public class MyServiceBoostrapper 
{ 
    public CompositionContainer MyServiceContainer 
    { 
     get { return Container; } 
    } 

    // Rest of bootstrapper definitions... 
} 

Dann MyService ‚s Konstruktor ändern:

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. 
} 
+0

Ja, das funktioniert. Vielen Dank. Natürlich ist das Ding, ich brauchte nicht einmal Prisma. Es war nur verwirrend das Problem. Auch das Lesen des 'Dependency Injection in .NET' Buches half zu klären, was wo gemacht wurde. Vor allem ihr Beispiel, wie man WCF bootstrappt. Ich bin heute zu müde, um diese Antwort hier zu schreiben, aber das wäre der richtige Weg, um einen WCF-Dienst zu starten. – drozzy

+0

Ja, Prism ist hier wahrscheinlich nicht notwendig, aber ich dachte mir, dass das Erklären, warum die Dinge nicht funktionierten, Ihnen helfen würde, eine bessere Entscheidung zu treffen, wie Sie Ihren Dienst bootstrappen und gleichzeitig Ihre aktuelle Implementierung beibehalten können. Wie auch immer, hoffe meine Antwort war etwas Hilfe. –

Verwandte Themen