np-*_*ard 5 generics wcf wcf-binding
我有一个客户端和服务器共享类型的应用程序,互操作性不是我们关注的问题之一.我打算为所有支持Web的对象创建一个存储库,我正在考虑为我的公开服务提供通用接口.
像T GetObject(int id)之类的东西
但是wcf不喜欢它,因为它试图暴露它的架构(我真的不关心)
是否有可能用WCF做这样的事情?,我可以使用任何类型的绑定不必是httpbinding或wsbinding ...
不,你不能.无论您是否想要或需要互操作性,WCF最基本的基础是消息交换.
客户端向服务器发送消息并获取响应.该消息是客户端和服务器之间传递的所有消息,需要可序列化为XML或二进制格式.这就是为什么传递的任何数据必须是原子的(如int,string)或DataContract - WCF服务堆栈的描述,关于如何序列化和反序列化这些对象.
您无法传递任何接口或其他"技巧" - 客户端和服务器之间的所有内容必须在XML模式中表达,基本上.
所以我担心你想要达到的目标与WCF提供的完全相反.SOA(面向服务的应用程序)的世界和范例是完全不同的,并不总是100%与OOP的想法和机制同步.
渣
我想这是可能的,尽管我不确定你是否想要这个。我会采取以下方法(未经测试,不确定是否有效)。首先在您的解决方案中创建以下项目结构:
ServiceInterfacesServiceImplementations(参考文献ServiceInterfaces和ModelClasses)ModelClassesHost(参考文献ServiceInterfaces和ServiceImplementations)Client(参考文献ServiceInterfaces和ModelClasses)你有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。