城堡WCF集成渠道关闭
本文关键字:WCF 集成 城堡 | 更新日期: 2023-09-27 17:56:23
我一直认为,为我的 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集成时,如何正确关闭WCF连接通道/代理呢?
编辑
删除了使用LifeStyle.Singleton
(容器被处置时释放通道)的提及,因为使用其他生活方式产生了相同的效果。
container.Release(myService);
不会释放您的单例组件。通道将与组件一起释放,在单例的情况下,这意味着容器被处置时。