我目前正在使用Unity容器和WCF服务开发PRISM应用程序。 在模块中(使用WCF代理),我为WCF客户端注册了一个ChannelFactory,如下所示:
InstanceContext instanceContext = new InstanceContext(new TradingPlatformCallback());
unityContainer.RegisterType<DuplexChannelFactory<IGenericTradingInterface>, DuplexChannelFactory<IGenericTradingInterface>>(
new ContainerControlledLifetimeManager(),
new InjectionConstructor(
instanceContext,
"NetNamedPipeBinding_IGenericTradingInterface"));
DuplexChannelFactory<IGenericTradingInterface> factory = unityContainer.Resolve<DuplexChannelFactory<IGenericTradingInterface>>();
factory.Open();
IGenericTradingInterface test = factory.CreateChannel();
test.GetServerInformation();
factory.Close();
现在,一切正常,所以我决定在另一个模块中使用这个ChannelFactory。 这是模块的Initialize方法:
var test = unityContainer.Resolve<DuplexChannelFactory<IGenericTradingInterface>>();
test.Open();
var test2 = test.CreateChannel();
test2.GetServerInformation();
test.Close();
所以此代码与其他模块完全相同,但缺少注册除外。
运行时,我得到以下异常:
Exception is: InvalidOperationException - The type DuplexChannelFactory`1 has mu
ltiple constructors of length 3. Unable to disambiguate.
对于ChannelFactory的解析和Ctors来说,这似乎是一个问题,但为什么团结解决了第一个模块中的工厂而不是这个模块?
我也不明白这个异常消息,因为我认为在注册时已经调用了一个特定的Ctor:
new InjectionConstructor(
instanceContext,
"NetNamedPipeBinding_IGenericTradingInterface")
有什么想法吗?
答案 0 :(得分:1)
您没有显示如何(或是否)跨模块共享统一容器。根据您的变量名称(“unityContainer”),我猜它是模块中的局部变量?这意味着您有两个单独的容器实例,每个实例都需要注册。
答案 1 :(得分:0)
事实证明问题是模块初始化的顺序。第一个模块被调用,因此Unity使用最多参数的CTor,DuplexChannelFactory最多有3个和多个模块。谢谢,Juergen