WCF 可以通过 ChannelFactory<TChannel>.CreateChannel()来创建 一个Client Channel对象来与服务通信,TChannel 需要在实例化ChannelFactory时硬编码明确指定。
但是我现在有个需求:我需要实例化ChannelFactory的时候,通过传递ServiceType参数,而不是
TChannel泛型类型参数,貌似要重新实现ChannelFactory。。。。
(我是想通过IOC来动态创建Client Channel,郁闷3天了)。
你应该这样来看
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);
在代码中,不会通过 IoC.Resolve<TChannel>()去获取TChannel,是通过构造函数或者属性注入实例的。
也就是说不会通过类似IoC.Resolve<TChannel>()这样的方式去指定TChannel的类型。
比如:
public class demoClass
{
public demoClass(IDataService dataService){...}
}
IDataService 就是 Service Contract!
@Yankee: IoC构造注入的时候,你同样需要事先注册你的实现类型IoC.Register<IDataService>(typeof(DataServiceImpl);同时为了支持构造注入,你还得先注册demoClass,IoC.Register demoClass;
当你使用语句:demoClass obj = IoC.Resolve<demoClass>()时,IoC内部会调用IoC.Resolve<IDataService>()的值作为参数传入demoClass的构造函数.
也就是说不管你是构造注入,还是属性注入,只要你描述的类型是接口,那么你就必须给接口提供一个实现类,同时,还需要指定接口和实现类之间的映射.
@荒原上的军旗: 开始我注册依赖关系的时候,并不是都单独注册的,是一个“筛选批量注册”的过程。
现在按照你的意思,换成单个单个的注册,在注册的时候指定 TChannel ,可以解决问题。
你在ioc里面注册 Func<TChannel,object>不行么?