【问题标题】:Is HierarchicalLifetimeManager the correct lifetime manager to use for WCF client / ChannelFactoryHierarchicalLifetimeManager 是用于 WCF 客户端/ChannelFactory 的正确生命周期管理器吗
【发布时间】:2015-02-16 09:29:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: wcf dependency-injection inversion-of-control unity-container object-lifetime


    【解决方案1】:

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

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

    一般的经验法则是重用 ChannelFactory&lt;T&gt; 实例(它们也是线程安全的),同时将通道视为一次性。事实上,基于ClientBase&lt;T&gt;生成的代理也在内部缓存了通道工厂to improve performance

    当通过 DI 容器创建这些对象时,建议将 ChannelFactory&lt;T&gt; 配置为 singleton 并将通道配置为 transient

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

    【讨论】:

    • 很高兴能帮上忙 :)
    • 稍微超出了这个问题的范围,但是在 Web 应用程序中,我是否将 .CreateChannel 注册为每个请求一次?处理故障通道等...? - 即HierarchicalLifetimeManager
    • 对于使用 Unity 的 Web 应用程序,我将使用 ContainerControlledLifetimeManagerHierarchicalLifetimeManager 配置 ChannelFactory&lt;T&gt; 通道,因为它们是 @ 987654323@ 他们在发布时创建的对象。或者,您可以编写自己的 lifetime manager per HTTP request,它也会在发布时进行处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多