2016-06-04 12 views
1

Ich habe Windows-Dienst, der Aufgaben auf Timer-Tick ausführt. Ich wählte auch, um mit Windows-Service durch WCF Named Pipe-Kanal zu kommunizieren. Ich kann die WCF-Service-Instanz erstellen und zum Zuhören öffnen. Aber wie greife ich auf Objekte zu, die im Windows-Dienst über WCF basieren? DieseWie mit Windows-Dienst über WCF kommunizieren?

ist, was mein Windows-Dienst wie folgt aussieht:

public partial class MyService : ServiceBase 
{ 
    private ServiceHost m_svcHost = null; 
    private myObject = null; 

    ... 

    // Run this method from external WCF client 
    private void SomeMethod() 
    { 
    } 

    protected override void OnStart(string[] args) 
    { 
     if (m_svcHost != null) m_svcHost.Close(); 

     m_svcHost = new ServiceHost(typeof(MyCommunicationService)); 
     m_svcHost.Open(); 

     // initialize and work with myObject 
    } 

    protected override void OnStop() 
    { 
     if (m_svcHost != null) 
     { 
      m_svcHost.Close(); 
      m_svcHost = null; 
     } 
    } 
} 

Also, was ich will, den Zugang zu myObject innerhalb WCF-Dienst haben, wenn der Client-Anfrage machen. Oder führen Sie sogar eine Methode für myObject aus.

+0

Diese Frage viel mehr Klärung bedarf. Fügen Sie Informationen hinzu, die Ihren bisherigen Fortschritt zeigen. Auf welche Objekte willst du auch zugreifen? –

+0

Aktualisiert. Grundsätzlich muss ich Windows-Dienstaktivitäten steuern, seinen Status über WCF-Dienst abfragen. – Pablo

+0

Sie benötigen nur einen Befehlskanal zwischen der 'MyCommunicationService'-Instanz und Ihrer Windows-Service-Instanz. Sie können das auf vielerlei Weise erreichen, zum Beispiel über eine statische Eigenschaft. –

Antwort

1

Sie können einen Kommunikationskanal zwischen Ihren MyService (WCF-Hosting-Unternehmen) erstellen und die MyCommunicationService (WCF Service-Instanz) einfach eine statische Eigenschaft mit:

//This can be put into a separate DLL if needed. 
public interface IMyHostCallbacks 
{ 
    void HostCallback(string iSomeDataFromWCFToHost); 
} 

public static class Host 
{ 
    public static IMyHostCallbacks Current; 
} 

public partial class MyService : ServiceBase, IMyHostCallbacks 
{ 
    protected override void OnStart(string[] args) 
    { 
     //Set the static callback reference. 
     Host.Current = this; 

     if (m_svcHost != null) m_svcHost.Close(); 

     m_svcHost = new ServiceHost(typeof(MyCommunicationService)); 
     m_svcHost.Open(); 

     // initialize and work with myObject 
    } 

    //Here you have data from WCF and myObject available. 
    void IMyHostCallbacks.HostCallback(string iSomeDataFromWCFToHost) 
    { 
     //Be careful here. 
     //Depending on your WCF service and WCF clients this might 
     //get called simultaneously from different threads. 
     lock(myObject) 
     { 
      myObject.DoSomething(iSomeDataFromWCFToHost); 
     } 
    } 
} 

Sicherlich kann man auch setzen das statische Feld in Ihre MyService Klasse, aber zumindest etwas Abstraktion zwischen MyService und MyCommunicationService würde nicht schaden.


nun an einer beliebigen Stelle in Ihrem MyCommunicationService können Sie:

void WCFServiceMethod() 
{ 
    Host.Current.HostCallback("some data"); 
} 
+0

Ich verstehe. Grundsätzlich ist es ein Singleton-Muster mit Controller-Objekt. Wenn es keine anderen Wege gibt, werde ich diese Antwort bald akzeptieren. – Pablo

+0

@Pablo Ja, aber vermassle die Dinge nicht mit dem Singleton-Begriff. Es ist die Windows-Dienstinstanz, die hier single ist. WCF-Dienst kann viele Instanzen haben. Solange der Windows-Dienst standardmäßig Singleton ist und dies der einzige Weg ist, ihn zu verwenden, nennen Sie ihn nicht Singleton. Ich verstehe hier nicht ganz, was Sie mit dem Controller-Objekt meinen. –