我有一个客户端和服务器共享类型的应用程序,而互操作性不是我们关注的问题之一。我计划为所有启用了Web的对象建立一个单一的存储库,并且我正在考虑为我的公开服务使用通用接口(interface)。

类似于T GetObject(int id)

但wcf不喜欢它,因为它试图公开其架构(我并不真正在乎)

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

最佳答案

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

  • ServiceInterfaces
  • ServiceImplementations(引用ServiceInterfacesModelClasses)
  • ModelClasses
  • Host(引用ServiceInterfacesServiceImplementations)
  • Client(引用ServiceInterfacesModelClasses)

  • ServiceInterfaces中,您有一个像这样的接口(interface)(我跳过了 namespace 等,以使示例更短):
    [ServiceContract]
    public interface IMyService<T>
    {
        T GetObject(int id);
    }
    

    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.
        }
    }
    

    Host中,您可以在App.config(或Web.config)文件中为服务提供正确的配置,并可以使用以下代码托管服务(假设它是独立应用程序):
    ServiceHost host = new ServiceHost(typeof(MessageManager.MessageManagerService))
    host.Open();
    

    最后,在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);
    

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

    关于wcf公开泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1359056/

    10-09 17:13