0

私は 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 呼び出しから返された時刻とは異なる時刻が表示され、別のインスタンスであることを示しています。

4

2 に答える 2

1

シングルトン クラスをサービスとして使用していると仮定します (コントラクトを実装します)。代わりにシングルトンを呼び出す WCF コントラクトとサービスを開発することをお勧めします。

したがって、次のようになります。

public class YourImpportantSingleton
{
    public YourImpportantSingleton Instance { get; set; }
    public void DoSeriousBusiness(){...}
}

[ServiceContract]
public interface IYourContract
{
    void YourRemoteAction();
} 

public class YourService : IYourContract
{
    public void YourRemoteAction()
    {
        YourImportantSingleton.Instance.DoSeriousBusiness();
    }
}

UPD:わかりました。winforms アプリケーションでセルフホスティングを使用していない可能性があることに気付きました。時間の無駄で申し訳ありません。

オプションはServiceHost、フォームアプリケーションでサービスをホストするか、サービスを個別に (たとえば IIS で) ホストし、このサービスをシングルトンのキーパーにするかのいずれかです。もちろん、現在の状態を保持しているため、別のサービスを呼び出すようにフォーム アプリケーションを変更する必要があります。

于 2012-07-26T14:27:24.653 に答える
0

ここでの問題は、アプリケーション自体ではなく、WCF サービス ホストがサービスをホストしていたことです。これにより、アプリケーションが別の ApplicationDomain で実行され、新しいシングルトンが作成されました。セルフホスティングに切り替えると、問題が解決しました。

于 2012-07-27T11:17:57.370 に答える