如何在没有默认无参数构造函数

时间:2016-03-01 17:37:06

标签: c# wcf inversion-of-control simple-injector

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

  

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

对于标记为[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]的服务,即使服务没有默认参数,SimpleInjectorServiceHostFactory - > CreateServiceHost(类型serviceType,Uri [] baseAddresses)方法也能正常工作无构造函数。

任何想法如何注入[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]服务的参数就像[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]服务一样,没有默认的无参数构造函数?< / p>

由于

2 个答案:

答案 0 :(得分:2)

经过一番挖掘后,我发现这是Simple Injector中的一个错误,或者至少是WCF处理此错误的方式的误解。

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

我为此在GitHub上创建了一个issue

  

但是为什么&#34; PerCall&#34;不需要这个默认构造函数。 WCF服务

因为在这种情况下,WCF将回调容器以创建类型,而Simple Injector offcourse可以处理构造函数中的参数。

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

答案 1 :(得分:1)

您必须拥有默认构造函数,这是WCF服务调用以创建您的实例的内容。您可以使用自己的Random Partitioner behavior on the joined RDD接管此过程并注入所需内容。

如果您正在使用Singleton(Single),那么ServiceHost期望您传递已创建的实例(可以使用任何类型的构造函数创建)。我不确定你的DI fx是如何构建这种实例的。请参阅此答案IInstanceProvider