我有一个客户端和服务器共享类型的应用程序,而互操作性不是我们关注的问题之一。我计划为所有启用了Web的对象建立一个单一的存储库,并且我正在考虑为我的公开服务使用通用接口(interface)。
类似于T GetObject(int id)
但wcf不喜欢它,因为它试图公开其架构(我并不真正在乎)
有可能用WCF做这样的事情吗,我可以使用任何类型的绑定(bind)而不必是httpbinding或wsbinding ...
最佳答案
我想这是可能的,尽管我不确定您是否想要这个。我会采用以下方法(未经测试,不确定是否可行)。首先在您的解决方案中创建以下项目结构:
ServiceInterfaces
ServiceImplementations
(引用ServiceInterfaces
和ModelClasses
)ModelClasses
Host
(引用ServiceInterfaces
和ServiceImplementations
)Client
(引用ServiceInterfaces
和ModelClasses
)在
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/