我有一个插件,我将在运行时实例化,我想从应用程序主机传递一个WCF服务。应用程序主机负责创建与服务的连接。这样做的原因是多个插件可以使用单个服务,但插件应该只知道它的接口,因为可能有多个IMyPluginServices实现。例如,插件实例的Run方法是:
public void Run(IMyPluginServices services)
{
services.DoSomething();
}
我遇到的问题是我不知道如何创建IMyPluginServices类型的服务并将其传递给Run函数。 VS 2010生成的服务引用似乎不会创建我可以传递给它的IMyPluginServices类型的对象。任何帮助将不胜感激。感谢。
答案 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的实例。
这样做的好处是你的新界面和部分类不需要任何实际的代码 - 这些定义足以完成工作。