代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  2
  • Alex  · 技术社区  · 10 年前

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

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

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

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

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

    1 回复  |  直到 10 年前
        1
  •  3
  •   Enrico Campidoglio    10 年前

    简单的答案是 ,但不适用于频道。

    创建 ChannelFactory<T> 对象是 昂贵的 操作,因为与创建实际通道相比,这是很多初始化的地方。

    一般经验法则是 重新使用 频道工厂<T> 实例(它们也是 线程安全的 )同时将通道视为 可任意处理的 。事实上,生成的代理基于 ClientBase<T> 也在内部缓存通道工厂 to improve performance .

    当通过DI容器创建这些对象时,建议配置 频道工厂<T> 单一的,单一的 以及通道 转瞬即逝的 :

    container.RegisterInstance(
        new ChannelFactory<IAccountService>("endpointName"),
        new ContainerControlledLifetimeManager());
    
    container.RegisterType<IAccountService>(
        new InjectionFactory(c =>
            c.Resolve<ChannelFactory<IAccountService>>().CreateChannel()));