私は IPC と WCF に最初の一歩を踏み出そうとしていますが、これまでのところ、面食らっています。私は、リモートの発信者のために何らかの手段を講じたい Winforms アプリケーションを持っています。winforms アプリケーションのビジネス ロジックのほとんどは、すべてのバックグラウンド作業を処理するシングルトンに限定されています。IPC メカニズムを介して一部の機能を公開したいと考えています。WCF は進むべき道のように思われるので、私はそれから始めました。
私が試したのは、ソリューションに WCF Service Library プロジェクトを追加することです。これにより、いくつかの呼び出しを公開したいと考えています。VS デバッガーで Winforms プロジェクトを開始すると、正常に実行され、WcfSvcHost が起動します。WcfTestClient を使用して WCF サービスと通信できます。
しかし、通信したいコードを保持しているシングルトンにアクセスしようとすると、新しいシングルトン オブジェクトを取得しているように見えます。明らかに、私は間違っています。私が推測しているのは、サービスが別のプロセスで実行されているため、実際の共有コードがなく、したがって共有シングルトンがないということです。
どうやって続けたらいいのかわからない。IPC に WCF を使用するという私の選択は間違っていますか? Winforms アプリケーションに WCF エンドポイントを統合する必要がありますか? 私が試みていることは実現可能ですか?
編集:これは非常に高レベルであり、また非常に単純であるため、コードサンプルは役に立たないと考えました。私は間違っていたと思います。だからいくつかのコード:
WinForms アセンブリで:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label1.Text = MySingleton.Instance.InitedAt.ToString();
}
}
public class MySingleton
{
private static MySingleton instance = new MySingleton();
private DateTime inited;
private MySingleton()
{
this.inited = DateTime.Now;
}
public static MySingleton Instance
{
get
{
return instance;
}
}
public DateTime InitedAt
{
get
{
return this.inited;
}
}
}
WCFServiceLibrary アセンブリで:
[ServiceContract]
public interface IApplicationProbe {
[OperationContract]
string DoesItWork();
[OperationContract]
string SingletonInited();
}
public class ApplicationProbe : IApplicationProbe {
public string DoesItWork(){
return "Why yes, yes it does";
}
public string SingletonInited(){
return MySingleton.Instance.InitedAt.ToString();
}
}
WcfTestClient を介してクエリを実行SingletonInited
すると、winforms シングルトンの instatiation と同じ DateTime ではない InitedAt が取得されます。
編集2:
このコードをそのまま実行しています (Winforms の周りに自動生成された足場を使用)。フォームのラベルには、WCF 呼び出しから返された時刻とは異なる時刻が表示され、別のインスタンスであることを示しています。