我来自Web Api所以也许这个问题会有点奇怪。 我在Visual Studio 2012中工作
我现在有两个WCF services
(但将来会更多)接受相同的对象(假设datacontract A具有相同的数据库)
string url1 = "myURL1";
BasicHttpBinding binding1 = new BasicHttpBinding();
EndpointAddress address1 = new EndpointAddress(url1);
ServiceClient1 serviceClient1 = new ServiceClient1(binding1, address1);
string url2 = "myURL2";
BasicHttpBinding binding2 = new BasicHttpBinding();
EndpointAddress address2 = new EndpointAddress(url2);
ServiceClient2 serviceClient2 = new ServiceClient2(binding2, address2);
可以打电话给他们吗?在一个唯一的方法,以便只是改变网址?
是否可以在没有任何类型参考的情况下调用它们?因为我需要在两者中使用通用方法,并且该方法接收相同的对象并检索相同的对象。
答案 0 :(得分:1)
T CreateServiceClient<T>(string url)
{
var binding = new BasicHttpBinding();
var endpointAddress = new EndpointAddress(url);
return (T) Activator.CreateInstance(typeof(T), new object[] {binding, endpointAddress});
}
应该可以这样使用它:
var client1 = new CreateServiceClient<ServiceClient1>("http://...");
var client2 = new CreateServiceClient<ServiceClient2>("http://...");
您可以查看泛型并尝试将T
限制为更具体,因为这不会为您提供任何类型安全。
如果您的动态意味着只有Type
,则可以执行此操作:
object CreateServiceClient(Type serviceClientType, string url)
{
var binding = new BasicHttpBinding();
var endpointAddress = new EndpointAddress(url);
return Activator.CreateInstance(serviceClientType, new object[] {binding, endpointAddress});
}
如果已定义了object
,只需将public class MyServiceWrapper
{
Type _serviceType;
public MyServiceWrapper(Type serviceType)
{
_serviceType = serviceType;
}
public object CreateInstance()
{
... code from above ...
}
public YourObject InvokeServiceMethod()
{
var instance = CreateInstance();
var methodInfo = _serviceType.GetMethod("MethodName");
return (YourObject) methodInfo.Invoke(instance, anyArguments);
}
}
更改为所有客户端遵守的更通用的界面或类。
根据您更新的问题,您需要执行以下两项操作之一
我强烈推荐#1,但如果出于某种原因无法做到,你可以做#2。如果你需要做#2,你可以在两者之间遇到并实现一个试图结合这些功能的包装类:
{{1}}