如何在没有默认无参数构造函数的情况下为单个 WCF 服务注入参数

本文关键字:参数 情况下 单个 WCF 注入 服务 构造函数 默认 | 更新日期: 2023-09-27 18:36:52

我正在使用SimpleInjector,当我尝试调用SimpleInjectorServiceHostFactory-->CreateServiceHost(Type serviceType, Uri[] baseAddresses)时出现以下错误。此错误仅对标记为 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 的 WCF 服务显示。

提供的服务类型无法作为服务加载,因为它没有默认(无参数)构造函数。若要解决此问题,请将默认构造函数添加到类型,或将该类型的实例传递给主机。

对于标记为 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 的服务,即使服务没有默认的无参数构造函数,SimpleInjectorServiceHostFactory-->CreateServiceHost(Type serviceType, Uri[] baseAddresses) 方法也能完美运行。

知道如何为[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]服务注入参数,就像[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]服务没有默认的无参数构造函数一样?

谢谢

如何在没有默认无参数构造函数的情况下为单个 WCF 服务注入参数

经过一番挖掘,我发现这是简单注入器中的一个错误,或者至少是WCF处理此问题的方式的误解。

ServiceHost类需要其 ctor 中的单一实例对象而不是类型。如果提供了类型,则ServiceHost将尝试创建实例,因此需要一个默认构造函数。

我为此在 GitHub 上创建了一个问题。

但为什么"PerCall"WCF 服务不需要此默认构造函数

因为在这种情况下,WCF 将回调到容器中以创建类型,并且简单注入器脱机可以处理构造函数中的参数。

一种可能的解决方法是确实将服务配置为 PerCall,并假设您希望 Single 进行某些缓存,将缓存从 WCF 实现重构到其自己的类中,并将其注册为简单注入器中的单一实例。

您必须有一个默认构造函数,WCF 服务调用该构造函数来创建实例。您可以使用自己的 IInstanceProvider 接管此过程,并注入所需的内容。

如果您使用的是单一实例(单一),则 ServiceHost 希望您传递已创建的实例(可以使用任何类型的构造函数创建该实例)。我不确定您的 DI fx 对构建此类实例有什么作用。请参阅此答案 WCF 并发模式单一和实例上下文模式每次调用以及。

相关文章: