wcf暴露泛型

np-*_*ard 5 generics wcf wcf-binding

我有一个客户端和服务器共享类型的应用程序,互操作性不是我们关注的问题之一.我打算为所有支持Web的对象创建一个存储库,我正在考虑为我的公开服务提供通用接口.

像T GetObject(int id)之类的东西

但是wcf不喜欢它,因为它试图暴露它的架构(我真的不关心)

是否有可能用WCF做这样的事情?,我可以使用任何类型的绑定不必是httpbinding或wsbinding ...

mar*_*c_s 8

不,你不能.无论您是否想要或需要互操作性,WCF最基本的基础是消息交换.

客户端向服务器发送消息并获取响应.该消息是客户端和服务器之间传递的所有消息,需要可序列化为XML或二进制格式.这就是为什么传递的任何数据必须是原子的(如int,string)或DataContract - WCF服务堆栈的描述,关于如何序列化和反序列化这些对象.

您无法传递任何接口或其他"技巧" - 客户端和服务器之间的所有内容必须在XML模式中表达,基本上.

所以我担心你想要达到的目标与WCF提供的完全相反.SOA(面向服务的应用程序)的世界和范例是完全不同的,并不总是100%与OOP的想法和机制同步.


Ron*_*erg 2

我想这是可能的,尽管我不确定你是否想要这个。我会采取以下方法(未经测试,不确定是否有效)。首先在您的解决方案中创建以下项目结构:

  • ServiceInterfaces
  • ServiceImplementations(参考文献ServiceInterfacesModelClasses
  • ModelClasses
  • Host(参考文献ServiceInterfacesServiceImplementations
  • Client(参考文献ServiceInterfacesModelClasses

你有ServiceInterfaces一个像这样的界面(我跳过了命名空间等以使示例更短):

[ServiceContract]
public interface IMyService<T>
{
    T GetObject(int id);
}
Run Code Online (Sandbox Code Playgroud)

ServiceImplementations你有一个类实现IMyService<T>

public class MyService<T> : IMyService<T>
{
    T GetObject(int id)
    {
        // Create something of type T and return it. Rather difficult
        // since you only know the type at runtime.
    }
}
Run Code Online (Sandbox Code Playgroud)

您在(或)文件Host中拥有正确的服务配置,并使用以下代码来托管您的服务(假设它是一个独立的应用程序):App.configWeb.config

ServiceHost host = new ServiceHost(typeof(MessageManager.MessageManagerService))
host.Open();
Run Code Online (Sandbox Code Playgroud)

最后Client使用一个ChannelFactory<TChannel>类来定义代理:

Binding binding = new BasicHttpBinding(); // For the example, could be another binding.
EndpointAddress address = new EndpointAddress("http://localhost:8000/......");
IMyService<string> myService =
    ChannelFactory<IMyService<string>>.CreateChannel(binding, address);
string myObject = myService.GetObject(42);
Run Code Online (Sandbox Code Playgroud)

再说一遍,我不确定这是否有效。诀窍是在主机和客户端之间共享您的服务接口(在 中ServiceInterfaces)和域模型对象(在 中)。ModelClasses在我的示例中,我使用一个字符串从服务方法返回,但它可以是项目中的任何数据协定类型ModelClasses