HierarchicalLifetimeManager 是用于 WCF 客户端/ChannelFactory 的正确生命周期管理器吗

Is HierarchicalLifetimeManager the correct lifetime manager to use for WCF client / ChannelFactory

我有一个非常简单的 WPF 应用程序正在调用

应用程序只有一个容器,在应用程序启动时配置。

WPF 应用程序具有对我的 WCF 服务的服务引用。
我已将生成的代理注册到容器中,如下所示:

container.RegisterType<IAccountService>(
    new HierarchicalLifetimeManager(),
    new InjectionFactory(c => new ChannelFactory<IAccountService>("endpoint_name")
    .CreateChannel()));

我的问题是,对于在用户与 UI 交互时调用 WCF 服务的 WPF 应用程序,使用 HierarchicalLifetimeManager 是否是正确的选择? (填写文本框并按搜索)

简短的回答是,但不适用于频道。

创建 ChannelFactory<T> 对象是一项 昂贵的 操作,因为与创建实际通道相比,这是进行大量初始化的地方。

一般的经验法则是 重用 ChannelFactory<T> 个实例(它们也是 线程安全的 )渠道一次性。事实上,基于 ClientBase<T> 生成的代理也在内部缓存通道工厂 to improve performance.

通过 DI 容器创建这些对象时,建议将 ChannelFactory<T> 配置为 singleton 并将通道配置为 transient:

container.RegisterInstance(
    new ChannelFactory<IAccountService>("endpointName"),
    new ContainerControlledLifetimeManager());

container.RegisterType<IAccountService>(
    new InjectionFactory(c =>
        c.Resolve<ChannelFactory<IAccountService>>().CreateChannel()));