城堡WCF整合频道关闭

时间:2011-05-13 01:30:39

标签: c# wcf castle-windsor integration castle

我的印象是,为我的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(放置容器时释放通道)的提及,因为使用其他生活方式产生了相同的效果。

1 个答案:

答案 0 :(得分:0)

container.Release(myService);不会释放您的单件组件。通道将与组件一起释放,在单件的情况下意味着容器被丢弃。