首页 新闻 搜索 专区 学院

WCF Client

0
悬赏园豆:100 [已解决问题] 解决于 2011-11-15 17:38

WCF 可以通过 ChannelFactory<TChannel>.CreateChannel()来创建 一个Client  Channel对象来与服务通信,TChannel 需要在实例化ChannelFactory时硬编码明确指定。

但是我现在有个需求:我需要实例化ChannelFactory的时候,通过传递ServiceType参数,而不是

TChannel泛型类型参数,貌似要重新实现ChannelFactory。。。。

(我是想通过IOC来动态创建Client  Channel,郁闷3天了)。

KAI168的主页 KAI168 | 初学一级 | 园豆:41
提问于:2011-11-14 11:09
< >
分享
最佳答案
0

你应该这样来看

1,TChannel client = ChannelFactory<TChannel>.CreateChannel();

就等同于使用IoC时的:

2,TChannel Client = IoC.Resolve<TChannel>();

在语句1中,WCF已经为TChannel提供了一个默认的实现.而在语句2中,IoC不会为TChannel提供默认实现,因此我们通常都会针对TChannel提供一个实现,类似如下:

public class TChannelImpl : TChannel{}

然后在IoC中注册: IoC.Register<TChannel>(typeof(TChannelImpl);

收获园豆:70
Launcher | 高人七级 |园豆:45045 | 2011-11-14 11:28

在代码中,不会通过 IoC.Resolve<TChannel>()去获取TChannel,是通过构造函数或者属性注入实例的。

也就是说不会通过类似IoC.Resolve<TChannel>()这样的方式去指定TChannel的类型。

比如:

public class demoClass

{

  public demoClass(IDataService dataService){...}

}

IDataService 就是 Service Contract!

KAI168 | 园豆:41 (初学一级) | 2011-11-14 11:50

@Yankee: IoC构造注入的时候,你同样需要事先注册你的实现类型IoC.Register<IDataService>(typeof(DataServiceImpl);同时为了支持构造注入,你还得先注册demoClass,IoC.Register demoClass;

当你使用语句:demoClass obj = IoC.Resolve<demoClass>()时,IoC内部会调用IoC.Resolve<IDataService>()的值作为参数传入demoClass的构造函数.

也就是说不管你是构造注入,还是属性注入,只要你描述的类型是接口,那么你就必须给接口提供一个实现类,同时,还需要指定接口和实现类之间的映射.

Launcher | 园豆:45045 (高人七级) | 2011-11-14 14:47

@荒原上的军旗: 开始我注册依赖关系的时候,并不是都单独注册的,是一个“筛选批量注册”的过程。

现在按照你的意思,换成单个单个的注册,在注册的时候指定 TChannel ,可以解决问题。

KAI168 | 园豆:41 (初学一级) | 2011-11-15 17:34
其他回答(2)
0

参考一下这篇文章:WCF, Mocking and IoC: Oh MY!

收获园豆:10
dudu | 园豆:37732 (高人七级) | 2011-11-14 11:36
0

你在ioc里面注册  Func<TChannel,object>不行么?

收获园豆:20
MSFT:waywa 韦恩卑鄙 | 园豆:303 (菜鸟二级) | 2011-11-15 17:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册