#wcf #unity-container
#wcf #unity-контейнер
Вопрос:
Я пытаюсь преобразовать образец, который я нашел, в конфигурацию XML..
Если это то, что я бы сделал в коде;
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<IServiceProxy<ITestService>, ServiceProxy<ITestService, TestServiceClient>>();
Что мне делать в XML? Я пытаюсь это сделать, но мне чего-то не хватает;
<unity>
<typeAliases>
<typeAlias alias="IServiceProxy" type="WCF.IServiceProxy, WCF" />
<typeAlias alias="ITestService"type="Interfaces.ITestService, Interfaces" />
<typeAlias alias="IServiceProxy[ITestService],ServiceProxy[ITestService,TestServiceClient]]" />
</typeAliases>
<containers>
<container name="servicesContainer">
<type type="IServiceProxy" mapTo="ServiceProxy" />
<type type="ITestService" mapTo="TestService" />
</container>
</containers>
</unity>
Комментарии:
1. Предположительно, вы видите сообщение об ошибке или какое-то неожиданное поведение. Не могли бы вы, пожалуйста, предоставить более подробную информацию? Кроме того, как бы то ни было, я избегаю использования XML-конфигурации Unity, поскольку это не принесло мне ничего, кроме боли. Я бы предпочел строгую типизацию, предоставляемую конфигурацией fluent.
2. ошибки нет, я просто не получаю клиент-службу, когда я выполняю разрешение в TestService или ITestService
3. Есть ли у вас несколько реализаций (кроме как для тестов)? Если нет, просто используйте синтаксис fluent code. Вы можете перестроить для запуска своих тестов. XML делает вещи сложнее, а не проще.
Ответ №1:
Я знаю только синтаксис Unity 2.0, и это не он. Например, type
узлы должны быть register
, а containers
узел никогда не поддерживался ни в одной версии Unity. Возможно ли, что вы просматриваете старую / плохую документацию?
Убедитесь, что вы используете Unity 2.0. Затем начните читать, используя конфигурацию во время разработки
Просто сканирую ваш xml, некоторые другие проблемы:
- Для ServiceProxy или TestService не определен псевдоним.
- Является ли ServiceProxy[] псевдонимом:
- Он не определяет тип
- Рекурсивные псевдонимы не поддерживаются.
Указание типов в файле конфигурации поможет вам с синтаксисом псевдонимов.
Ответ №2:
В вашем примере ваши псевдонимы полностью изменены. Вы не можете использовать синтаксис квадратных скобок в псевдонимах для одного, вы должны использовать синтаксис типа CLR. В последнем псевдониме вы просто указываете псевдоним, который представляет собой большую длинную строку, но вы никогда не указываете тип. Вы также никогда не указываете псевдоним ServiceProxy, так что это имя просто не существует и не может быть найдено.
Предполагая, что вы используете Unity 2.0 и добавили соответствующие узлы <namespace> и <assembly> в XML для указания на ваши сборки, это должно сработать:
<unity>
<namespace name="WhateverYourNamespaceIs" />
<assembly name="AndWhateverAssembliesAre" />
<container name="servicesContainer">
<register type="IServiceProxy[ITestService]" mapTo="ServiceProxy[ITestService, TestServiceClient]" />
</container>
</unity>