通过WCF公开winforms应用程序内部

时间:2012-07-26 13:56:33

标签: c# visual-studio-2010 wcf ipc

我正在尝试将我的第一步带入IPC和WCF,到目前为止,我正在我的脸上摔倒。我有一个Winforms应用程序,我想对远程调用者有所帮助。 winforms应用程序的大多数业务逻辑仅限于一个负责所有后台工作的单例。我想通过IPC机制公开一些功能。 WCF似乎是前进的方向,所以我从那开始。

我尝试将WCF服务库项目添加到我的解决方案中,我希望通过该项目公开一些调用。当我在VS调试器中启动Winforms项目时,它正常运行,并启动WcfSvcHost。我可以使用WcfTestClient与WCF服务进行通信。

但是,当我尝试访问包含我想要与之通信的代码的单例时,似乎我得到了一个新的单例对象。显然,我做错了;我猜想发生的事情是该服务在不同的进程中运行,因此没有真正的共享代码,因此没有共享的单例。

我不确定如何继续。我选择使用WCF用于错误的IPC吗?我应该在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时,我得到的InitedAt与winforms singleton的instatiation不同。[/ p>

EDIT2:

我有这样的代码按原样运行(使用围绕Winforms的自动生成的脚手架)。表单上的标签显示的时间与从WCF调用返回的时间不同,表明它是一个不同的实例。

2 个答案:

答案 0 :(得分: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),并使此服务成为您的单身人士的守护者。您必须更改表单应用程序以调用单独的服务,因为它现在保持状态。

答案 1 :(得分:0)

这里的问题是WCF服务主机托管服务,而不是应用程序本身。这导致应用程序在单独的ApplicationDomain中运行,从而导致创建新的单例。切换到自托管解决了这个问题。