Castle 3.0 WCF Facility - Не разрешаются параметры в конструкторе сервисов - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь добавить параметры конструктора Castle (3.0) в службу WCF, например

ServiceHostBase clientServiceHost = new Castle.Facilities.WcfIntegration.DefaultServiceHostFactory()
.CreateServiceHost(typeof(IClientExchange).AssemblyQualifiedName, new Uri[0]);

Однако я получаю следующее исключение: «Предоставленный тип сервиса не может быть загружен как сервис, поскольку у него нет конструктора по умолчанию (без параметров).»

Служба impl типа ClientExchange принимает параметр конструктора типа IProviders

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class ClientExchangeService : ExchangeService, IClientExchange
{
    public ClientExchangeService(IProviders providers)
        : base(providers) { }
}

Мой установщик Windsor выглядит так:

container.AddFacility<WcfFacility>()
.Register
(
  Component.For<IProviders>().Instance(Providers.DbInstance),
  Component.For<IClientExchange>().ImplementedBy<ClientExchangeService>(),
);

В настоящий момент кажется, что WCF пытается обновить сервис без блокировки, обеспечивающей зависимость. Перепробовал несколько альтернативных примеров, но многие для предыдущих версий Castle pre 3.0. Должно быть, я где-то скучаю по крючку? Как мне сказать WCF отложить ответственность за строительство до замка?

1 Ответ

4 голосов
/ 13 марта 2012

Я думаю, что это: как передать значения конструктору в моей службе wcf может быть ответом на вашу проблему. Или для чего-то более специфического для Виндзора это может помочь: Внедрение зависимостей в WCF с использованием Castle Windsor .

UPDATE

Хорошо, так что я думаю, что понял это. Прежде всего, проблема в этом атрибуте:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

Если вы не укажете, что Виндзор сможет впрыскивать зависимости в конструктор совершенно нормально - с этим он не может.

Посмотрев на описание этого атрибута здесь Я вижу, что вы хотите, чтобы ваш сервис был одноэлементным, так как для Windsor это значение по умолчанию, вы можете просто удалить этот атрибут, и он должен начать работать для вас и ведите себя так, как вы ожидаете.

Существуют два других стиля жизни, которые могут вас заинтересовать, специально для WCF:

  • LifestylePerWcfOperation ()
  • LifestylePerWcfSession ()

(укажите их в обычном месте - более подробная информация доступна здесь )

Кстати, вам вообще не нужно ничего делать ServiceHostBase, вместо этого вы можете использовать метод расширения AsWcfService следующим образом (лично я предпочитаю такой способ):

container
    .AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero)
    .Register(
        Component
            .For<IProviders>()
            .Instance(Providers.DbInstance),
        Component
            .For<IClientExchange>()
            .ImplementedBy<ClientExchangeService>()
            .AsWcfService(new DefaultServiceModel()
                .AddEndpoints(WcfEndpoint
                    .BoundTo(new BasicHttpBinding())
                    .At("http://localhost:8000/ClientExchangeService"))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...