2011-01-17 5 views
0

このポストは序文の前に警告があります。私はかなり有能なプログラマーですが(4年間の大学で新鮮なものになることができれば)、私はWindowsプログラミングには非常に慣れています。私は.NET C#(バージョン4)でプログラミングしています。ローカルオブジェクトへの.NET WCFアクセス

「クライアント」構成ユーティリティ(Windowsフォームアプリケーション)を使用してリモートから構成できるWindowsサービスを作成しようとしています。私がWCFをIPCに選択したのは、WCFがWindows Remotingの代わりであり、Remotingが段階的に廃止されているからです。

私の問題は、設定ユーティリティがWindowsサービスに接続するときに作成されたWCFインスタンスから既にインスタンス化されたオブジェクトにアクセスする方法を理解できないことです。

おそらく、この非常に簡略化されたコードブロックは、私が何をしようとしているのか、より多くのアイデアを与えるでしょう。 (私が行くようにロジックでうまくいけば、何も恥ずかしいエラー。それを作りません。)

class Blah 
{ 
    /* 
    * Create configuration object that is read 
    * by myApp and written to by myServ. 
    */ 
    ConfigManager confMan = new ConfigManager(); 

    MyService myApp = new MyService(ref confMan); 
    Thread myAppT = new Thread(new ThreadStart(myApp.init)); 
    myAppt.Start(); 
    myAppT.Join(); 

    //The confServ will handle all of the WCF related stuff 
    ConfigServer confServ = new ConfigServer(confMan); 
    Thread confServT = new Thread(new ThreadStart(confServ.init)); 
    confServT.Start(); 
    confServT.Join(); 
} 

class ConfigManager 
{ 
    public bool someAttribute; 

    public ConfigManager() 
    { 
    } 

    public init() 
    { 
     someAttribute = false; 
    } 
} 

class MyService 
{ 
    ConfigManager confMan; 

    public MyService(ref ConfigManager confMan) 
    { 
     this.confMan = confMan; 
    } 

    public int init() 
    { 
     while(1==1) 
     { 
      if(confMan.someAttribute == true) 
       return 0; 
     } 
    } 
} 

class ConfServ 
{ 
    ConfigManager confMan; 
    public ConfServ(ref ConfigManager confMan) 
    { 
     this.confMan = confMan; 
    } 

    public void init() 
    { 
     //Do all the ServiceHost WCF stuff 
    } 
} 

[ServiceContract] 
public interface IModConfig 
{ 
    [OperationContract] 
    void changeFalse(); 
    void changeTrue(); 
} 

/* 
* How can I get my instance of confMan 
* into this instance of ModConfig 
*/ 
class ModConfig: IModConfig 
{ 
    public void changeFalse() 
    { 
     /* 
     * I want to change confMan.someAttribute 
     * to false here. 
     */ 
    } 

    public void changeTrue() 
    { 
     /* 
     * I want to change confMan.someAttribute 
     * to true here. 
     */ 
    } 
} 

は基本的に私はちょうどMyServiceでインスタンスによって参照されているCONFIGMANAGERインスタンスに書き込むことができるようにしたいです。

私は私の問題を明確に定義したと思います。私のポストをさらに詳しく説明する必要があるかどうかを教えてください。

+0

私はソケットを開くことを考えましたが、それはIPCフレームワークを使う目的を打ち負かしているようです。 – bdeetz

+0

スレッドには何がありますか? 'Thread myAppt ... myAppT.Join();を' myApp.init(); 'に置き換えます。 'confServer.init'と同じです。読みやすく、デバッグが簡単です。 –

答えて

0

ここであなたの設定を保存していますか?

public void changeTrue()  
{   
    // load configuration from some file, database, other storage 
    // update configuration 
    // persist the new configuration 
} 

この構成をメモリに保持すると、インスタンスが1つだけになるようにシングルトンオブジェクトまたはスタティックオブジェクトにすることができます。次に、単一インスタンスを取得して変更します。

ところで、while(1==1)は正しく見えません。

+0

私はそれを今のところメモリに保存しています。私は静的なオブジェクトのアイデアが好きです。私はちょうどそれについて正しい考えをしていませんでした。 – bdeetz

1

構成を格納する静的フィールド/プロパティを使用すると技術的にこの問題が解決されますが、私はそれを汚れたハックとみなします。コードが静的フィールドに依存するほど、スケーラビリティは低下します(ある時点で、2つの同一のサービスを1つのプロセスでホストしたい場合はどうなりますか?)、単体テストにはるかに耐性があります。あなたは取り除くことができ、

MyService app = ... 
... 

WcfService myService = new WcfService(app); 
ServiceHost wcfHost = new ServiceHost(myService); 
wcfHost.Open(); 

... 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public class WcfService : IYourWcfContract 
{ 
    private MyService _app; 

    public WcfService(MyService app) 
    { 
     _app = app; 
    } 

    // Implements IYourWcfContract.UpdateConfiguration 
    public void UpdateConfiguration(string newConfig) 
    { 
     _app.UpdateConfiguration(newConfig); 
    } 
} 

を代わり:

これに対する正しい解決策は、それが何にコアは必要なオブジェクトを参照渡して、WCFフレームワークとInstanceContextMode.Singleを使用して、明示的にあなたのWCFサービスの実装オブジェクトを作成しています一見無意味な委任であり、MyServiceオブジェクトをWCFサービスの実装自体として使用します。しかし、これはまた、MyServiceに別のバインディングを置くので、(私の見解では)あまり望ましくありません。

関連する問題