将多个类切换到WCF

时间:2012-01-23 09:36:19

标签: c# wcf

我有一个界面和多个使用该界面的类,也在服务器上有一个工厂,它根据一些参数创建一个特定的实例。

现在我必须将这些类暴露给WCF客户端,我希望我能够将接口标记为OperationContract并建立通信,但它似乎在服务器上(我是WCF新手)我必须为每个类创建一个服务(或至少打开一个端口),我不能为接口创建它。

这是唯一的方法吗?或者我错过了什么?

编辑澄清:
假设我有一个方法的接口,我们称之为Execute(EnumedParam action)。 我希望能够通过

从客户端调用它
InterfaceType.Execute(Action.One);

并在服务器上根据操作创建实例并执行它的Execute方法。

同样可能有很多类的实例,我希望客户端不要对类有任何了解,只需要了解接口。

我如何通过WCF做到这一点?

(注意:如果我的班级模型完全错误,您可以推荐一本书或博客,我可以在这里阅读更多相关内容吗?)

我无法在其他编辑的评论中粘贴代码

Wouter de Kort给出了我正在做的事情的一个很好的例子。但是我如何为此设置端点? 看一下这里给出的例子http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication - 作者打开这样的端口:

using (ServiceHost host = new ServiceHost(
  typeof(StringReverser),
  new Uri[]{
    new Uri("http://localhost:8000"),
    new Uri("net.pipe://localhost")
  }))
{

现在这就是我的问题所在。第一个参数是一个类(不能是接口或抽象类)。我是否必须为扩展接口的每个类执行此操作,或者我可以以某种方式为多个类使用相同的主机?

1 个答案:

答案 0 :(得分:2)

假设您有以下服务界面:

public interface IMyService 
{
    void Execute(EnumdParam action);
}

如果你想在WCF中使用它,你将装饰它:

[ServiceContract]
public interface IMyService 
{
   [OperationContract]
   void Execute(EnumdParam action);
}

在您的客户端上,您必须创建一个代理来访问WCF服务。

[System.Diagnostics.DebuggerStepThroughAttribute()]
public partial class MyServiceClient : ClientBase<IMyService>, IMyService
{
    public MyServiceClient ()
    {
    }

    public void Execute(EnumdParam action);
    {
        return base.Channel.Execute(action);
    }
}

如您所见,您的客户端代理实现了IMyService,因此在您的客户端代码中,您只需要知道IMyService接口。如果您将工厂更改为返回MyServiceClient而不是MyService,则客户端代码中的任何内容都不得更改(WCF配置除外并确保丢弃客户端)。