У меня сложилось впечатление, что освобождение компонента для моего подключения к службе 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
(когда канал освобождается при утилизации контейнера), поскольку использование других стилей жизни дало тот же эффект.