0

我正试图迈出进入 IPC 和 WCF 的第一步,但到目前为止,我的脸都跌倒了。我有一个 Winforms 应用程序,我想为远程调用者提供一些工具。winforms 应用程序的大部分业务逻辑都局限于一个处理所有后台工作的单例。我想通过 IPC 机制公开一些功能。WCF 似乎是前进的方向,所以我从那个开始。

我尝试的是在我的解决方案中添加一个 WCF 服务库项目,我想通过它公开一些调用。当我在 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();
  }
}

当我SingletonInited通过 WcfTestClient 查询时,我得到一个 InitedAt,它与 winforms 单例的实例化的 DateTime 不同。

编辑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 回答