2009-10-04 83 views
2

我試圖動態創建的ChannelFactory:動態建立的ChannelFactory

 

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

的問題是,你可以看到,在第二行,在那裏我沒有泛型類型,不幸的是, ChannelFactory沒有接受Type的重載。

任何方式嗎?

回答

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); 
 
+0

我不得不做「typeof(ChannelFactory <>)」來使它工作 – Robin 2012-12-21 17:30:55

0

哈迪:這是否forum post here(由羅馬吻檢查出的答案,提供自定義ChannelFactory2類)地址你在找什麼?

如果是這樣,你可以停止閱讀我的回答:-)

那麼,通常你會做這樣的:

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

2)創建/檢索你的綁定和端點信息

3)該接口創建一個通道工廠:

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

4)從通道工廠,創建您的客戶端代理:

IMyServiceInterface client = myChannelFactory.CreateChannel(); 

5)客戶端調用方法:

client.DoStuff(); 

因此,這部分是它,你想使更多的通用/更有活力,爲什麼?這個想法背後的動機是什麼?

Marc

+0

背後的想法很複雜。我有一組現有類,在本地實現相同的接口,我想將這些接口的調用重定向到它們在遠程機器上的等效實現,並將它們作爲WCF服務器託管。這就是爲什麼它更具活力。我所擁有的只是界面的類型,以及類型信息中的可用方法。 – 2009-10-06 10:07:42