Unity не может разрешить тип при разрешении в другом модуле - PullRequest
0 голосов
/ 22 октября 2011

В настоящее время я работаю над приложением PRISM с контейнером Unity и службой WCF. В модуле (с прокси WCF) я регистрирую ChannelFactory для клиента WCF следующим образом:

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.

Кажется, это проблема с разрешением и Ctors ChannelFactory, но почему единство может разрешить фабрику в первом модуле, а не в этом?

Я также не понимаю это сообщение об исключении, так как я думал, что вызвал определенный Ctor при регистрации:

new InjectionConstructor(
                instanceContext,
                "NetNamedPipeBinding_IGenericTradingInterface")

Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Вы не показываете, как (или нет) контейнер Unity используется несколькими модулями.Основываясь на вашем имени переменной ("unityContainer"), я предполагаю, что это локальная переменная в модуле?Это означает, что у вас есть два отдельных экземпляра контейнера, каждый из которых потребует регистрации.

0 голосов
/ 22 октября 2011

Оказывается, проблема заключалась в порядке инициализации модуля. Второй модуль был назван первым, поэтому Unity получает CTor с наибольшим количеством параметров, а DuplexChannelFactory имеет не более 3 и многие из них. Спасибо, Юрген

...