0

我目前正在使用统一容器和 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")

有任何想法吗?

4

2 回答 2

1

您没有显示统一容器如何(或是否)跨模块共享。根据您的变量名称(“unityContainer”),我猜它是模块内的局部变量?这意味着您有两个单独的容器实例,每个容器实例都需要注册。

于 2011-10-22T02:18:42.000 回答
0

原来问题出在模块初始化的顺序上。第二个模块首先被调用,因此 Unity 采用具有最多参数的 CTor,而 DuplexChannelFactory 最多有 3 个,而且其中很多。谢谢,于尔根

于 2011-10-22T08:41:00.437 回答