2012-07-26 86 views
0

我正在尝试着迈入IPC和WCF的第一步,到目前为止,我还是落在了我的脸上。我有一个Winforms应用程序,我想对远程调用者进行一些测试。 winforms应用程序的大部分业务逻辑都局限于一个负责所有后台工作的单例。我想通过IPC机制公开一些功能。 WCF看起来像是前进的方向,所以我从此开始。通过WCF暴露Winforms应用程序的内部

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

但是,当我尝试访问持有代码的单例时,我想与之通信,看起来好像我正在获取新的单例对象。显然,我做错了;我猜想发生的事情是服务运行在不同的进程中,所以没有真正的共享代码,因此没有共享的单身人士。

我不知道该如何继续。我选择使用WCF的IPC是错误的吗?我应该将WCF端点集成到Winforms应用程序中吗?我正在尝试甚至可行吗?

编辑:我想这是如此高层次,也很简单,任何代码示例都是无用的。我认为我错了。因此,一些代码:

在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这是不一样的DateTime作为winforms单例的安装。

EDIT2:

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

+0

带WCF的IPC通常使用命名管道完成。它当然受到支持;但是有很多开销。除了WCF之外,还有更多高性能的IPC方法。内存映射文件,例如。 – 2012-07-26 15:50:03

+0

你的意思是WCF而不是WPF?这是第一次设置:首先让它工作,然后让它有效地工作。由于我还没有第一步工作,我还没有到第二步,但我认为命名管道将是一个很好的候选人。我会查看内存映射文件,感谢您的建议。 – Martijn 2012-07-26 15:52:51

+0

是的,WCF,而不是WPF ... autocorrect :) – 2012-07-26 15:53:52

回答

0

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

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)并使此服务成为您的单身人员的管理员。您必须更改您的表单应用程序才能调用单独的服务,因为它当前拥有该状态。

+0

我为现在的东西添加了一些代码,看起来和你的一样怪异 – Martijn 2012-07-26 14:45:31

+0

@Martijn,那么WCF将不会创建你的单例的第二个实例(顺便说一句,你忘记了静态的东西),但它会创建实例(s)你的服务类。 – Dmitriy 2012-07-26 14:49:01

+0

我忘记了这里的静态信息,只是修正了它们。我要运行我的示例代码,我会让你知道发生了什么。感谢您的帮助! – Martijn 2012-07-26 14:51:03