我的印象是,为我的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)
,但在组件发布后,通道仍保持打开状态。这是预期的行为吗?
那么在使用Castle WCF Integration时如何正确关闭WCF连接通道/代理呢?
修改
删除了使用LifeStyle.Singleton
(放置容器时释放通道)的提及,因为使用其他生活方式产生了相同的效果。
答案 0 :(得分:0)
container.Release(myService);
不会释放您的单件组件。通道将与组件一起释放,在单件的情况下意味着容器被丢弃。