我正在使用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>
由于
答案 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。