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()));
我有一个非常简单的 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()));