动态构建ChannelFactory

时间:2009-10-04 13:40:44

标签: wcf generics

我正在尝试动态创建ChannelFactory:


var serviceType = GetServiceProxy();
var interfaceType = serviceType.GetServiceInterface(); //return IServiceInterface
var service = new ChannelFactory(binding, address);

问题是,正如您所看到的,在第二行,我没有泛型类型,不幸的是,ChannelFactory没有接受Type的重载。

任何方式吗??

2 个答案:

答案 0 :(得分:3)

发现我只能用反射做到这一点。当然,您还必须使用反射调用方法。

创建“ChannelFactory”并调用“CreateChannel”方法:


private ChannelFactory CreateChannelFactory()
{
   var channelFactoryType = typeof (ChannelFactory);

   channelFactoryType = channelFactoryType.MakeGenericType(serviceType);

   return (ChannelFactory)Activator.CreateInstance(channelFactoryType, binding, address);
}

private object CreateChannel()
{
   var createchannel = channelFactory.GetType().GetMethod("CreateChannel", new Type[0]);
   return createchannel.Invoke(channelFactory, null);
}

现在创建了频道,但由于只有接口类型可用,我只能调用方法:


var serviceType = service.GetType();
var remoteMethod = service.GetMethod(invocation.Method.Name);

remoteMethod.Invoke(service, invocation.Arguments);

答案 1 :(得分:0)

Hadi :这是forum post here(请查看Roman Kiss的答案,提供自定义 ChannelFactory2 类)解决您的问题寻找??

如果是这样,你可以停止阅读我的回复: - )

嗯,通常你会这样做:

1)有你的服务接口(IMyServiceInterface)

2)创建/检索您的绑定和端点信息

3)为该界面创建一个频道工厂:

ChannelFactory<IMyServiceInterface> myChannelFactory =
    new ChannelFactory<IMyServiceInterface>(myBinding, myEndpoint);

4)从该渠道工厂,创建您的客户端代理:

IMyServiceInterface client = myChannelFactory.CreateChannel();

5)在该客户端上调用方法:

client.DoStuff();

那么你想要制作更通用/更动态的部分,为什么?这个想法背后的动力/驱动力是什么?

马克