我有一个界面和多个使用该界面的类,也在服务器上有一个工厂,它根据一些参数创建一个特定的实例。
现在我必须将这些类暴露给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")
}))
{
现在这就是我的问题所在。第一个参数是一个类(不能是接口或抽象类)。我是否必须为扩展接口的每个类执行此操作,或者我可以以某种方式为多个类使用相同的主机?
答案 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配置除外并确保丢弃客户端)。