如何将服务传递给另一个插件?

时间:2010-06-04 14:52:32

标签: wcf wcf-client

我有一个插件,我将在运行时实例化,我想从应用程序主机传递一个WCF服务。应用程序主机负责创建与服务的连接。这样做的原因是多个插件可以使用单个服务,但插件应该只知道它的接口,因为可能有多个IMyPluginServices实现。例如,插件实例的Run方法是:

    public void Run(IMyPluginServices services)
    {
        services.DoSomething();
    }

我遇到的问题是我不知道如何创建IMyPluginServices类型的服务并将其传递给Run函数。 VS 2010生成的服务引用似乎不会创建我可以传递给它的IMyPluginServices类型的对象。任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

在VS 2010中为服务添加服务引用时,它会生成一个名为IMyService的接口,其中包含服务中每个OperationContract的方法。它还会生成一个名为MyServiceClient的具体类,可以构造它,然后用它来调用您的服务。

现在,我相信,您遇到的问题是MyServiceClient是ClientBase<IMyService>的子类,并没有实现生成的IMyService接口(这真的很痛苦)。

为了解决这个问题,我最终创建了一个新界面:

public interface IMyServiceClient : IMyService, IDisposable, ICommunicationObject
{
}

(注意:只有当您希望模块能够检测/响应故障通道和其他此类事物时,才需要IDisposable和ICommunicationObject。)

然后我使用部分类扩展MyServiceClient(在包含我的WCF服务引用的程序集中):

public partial class MyServiceClient : IMyServiceClient
{
}

现在在我的模块中,我可以接受IMyServiceClient而不是IMyService,并且仍然执行我需要的所有方法。控制模块的应用程序仍然可以像往常一样创建MyServiceClient的实例。

这样做的好处是你的新界面和部分类不需要任何实际的代码 - 这些定义足以完成工作。