Я пытаюсь настроить клиент для дуплексной службы WCF через Unity 2.0.Для этого я хочу вставить реализацию моего CallbackContract - IUpdateClient
- в InstanceContext
, который затем вставляется в мой прокси-сервер службы, в этом случае подкласс DuplexClientBase<IUpdateService>
называется UpdateProxy
.
Проблема, с которой я сталкиваюсь, заключается в том, что при попытке использовать прокси-сервер, хранящийся в моем контейнере Unity, для подписки клиента на обновления из службы, я получаю следующее исключение:
InstanceContext, предоставленный дляChannelFactory содержит UserObject, который не реализует CallbackContractType '..Services..ServiceContracts.IUpdateClient'.
Я обращаюсь к прокси-серверу примерно так:
_container.Resolve<IUpdateService>("updateServiceImpl").Subscribe();
Учитывая мойКонфигурация Unity:
<!-- Interface to implementation mappings -->
<register type="RepositoryInterface" mapTo="Repository" name="repositoryImpl">
<constructor>
<param name="proxy" dependencyName="proxyImpl"/>
</constructor>
</register>
<!-- Here's the bit that doesn't seem to be resolving as expected -->
<register type="UpdateClientInterface" mapTo="UpdateClient" name="updateClientImpl">
<lifetime type="singleton"/>
<constructor>
<param name="repository" dependencyName="repositoryImpl"/>
</constructor>
</register>
<register type="System.ServiceModel.InstanceContext, System.ServiceModel,
Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="instanceContext">
<constructor>
<param name="implementation" dependencyName="updateClientImpl"/>
</constructor>
</register>
<!-- This is the type I'm resolving with the above _container.Resolve() statement -->
<register type="UpdateServiceInterface" mapTo="UpdateService" name="updateServiceImpl">
<constructor>
<param name="callbackInstance" dependencyName="instanceContext"/>
</constructor>
</register>
<register type="ProxyInterface" mapTo="Proxy" name="proxyImpl">
<constructor>
<param name="configurationName">
<value value="ServiceEndpointFromAppConfig"/>
</param>
</constructor>
</register>
Я ожидаю, что когда я разрешу класс UpdateService, можно увидеть здесь:
public class UpdateProxy : DuplexClientBase<IUpdateService>, IUpdateService
{
public UpdateProxy(InstanceContext callbackInstance)
: base(callbackInstance) {}
public void Subscribe() {}
[...]
}
Что контейнер Unity создает InstanceContext
(зарегистрированный как "instanceContext")в конфигурации) и, при этом, он должен создавать экземпляр типа, зарегистрированного как "updateClientImpl" - , который фактически реализует IUpdateClient
- и передать это в конструктор InstanceContext в качестве параметра implementation
.
Тем не менее, я получаю ошибку, как указано выше.
Подводя итоги (он же «версия tl; dr»): Когда контейнер Unity разрешает InstanceContext, он, кажется, не создает свою реализацию правильно.Я не знаю, является ли это ошибкой в конфигурации, или я в корне неправильно понимаю, как контейнер Unity разрешает набор зависимых типов.Любое руководство по этому вопросу было бы полезно.