Закрытие интеграционного канала Castle WCF - PullRequest
0 голосов
/ 13 мая 2011

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

// In some installer class
public void Install(IWindsorContainer container, IConfigurationStore store) {
    container.Register(
        Component.For<IMyService>()
            .Forward<IMyOtherService>()
            .AsWcfClient(WcfEndpoint.FromConfiguration("WSHttpBinding_IMyService"))
            .LifeStyle.Transient
    );
}

// In some local class enabling constructor injection for IMyService
public void DoStuff() {
    IWindsorContainer container = GetContainer();

    var myService = container.Resolve<IMyService>();

    if(myService != null) {
        container.Release(myService);

        // I had always thought this shouldn't work
        // as the channel should be closed - but its
        // state is Opened
        var foo = myService.GetSomething( ... );

        DoOtherStuff(foo);
        ...
    }
}

Я пробовал разные образы жизни, включая мой собственный, который наследует AbstractLifestyleManager и вызывает base.Release(context), но канал остается открытым после выпуска компонента.Это ожидаемое поведение?

Итак, как правильно закрыть канал / прокси-соединение WCF при использовании Castle WCF Integration?

Редактировать

Удалено упоминаниеиспользования LifeStyle.Singleton (когда канал освобождается при утилизации контейнера), поскольку использование других стилей жизни дало тот же эффект.

1 Ответ

0 голосов
/ 13 мая 2011

container.Release(myService); не освобождает ваш одноэлементный компонент.Канал будет освобожден вместе с компонентом, который в случае синглетонов означает, что контейнер утилизируется.

...