我正在尝试将我的第一步带入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调用返回的时间不同,表明它是一个不同的实例。
答案 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中运行,从而导致创建新的单例。切换到自托管解决了这个问题。