WCF 使用反射来创建服务实例,所以如果你的服务没有没有参数的构造函数,wcf 将无法创建服务实例,这就是 wcf 显示错误的原因。
注入框架与wcf的集成并不容易。
您应该自定义实例提供者(提供 wcf 服务实例)。
https://blogs.msdn.microsoft.com/carlosfigueira/2011/05/31/wcf-extensibility-iinstanceprovider/
在您的自定义实例提供程序中,您可以在 GetInstance 方法中提供您注入的服务实例。
那么你应该通过服务行为让 wcf 使用你自己的实例提供者。
例如
public class MyServiceAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher item in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher item1 in item.Endpoints)
{
item1.DispatchRuntime.InstanceProvider = new MyInstanceProvider(); // apply customized instanceProvider
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
然后您应该自定义一个 ServiceHost 以应用服务行为。
喜欢
public class MyUnityServiceHost : ServiceHost
{
protected MyUnityServiceHost()
{
}
protected override void OnOpening()
{
base.OnOpening();
if (this.Description.Behaviors.Find<MyServiceAttribute >() == null)
{
this.Description.Behaviors.Add(new MyServiceAttribute ());//add your behavior
}
}
}
最后,您应该自定义 HostFactory 以创建您自定义的服务主机。
https://blogs.msdn.microsoft.com/carlosfigueira/2011/06/13/wcf-extensibility-servicehostfactory/
您可以参考下面的类似讨论。
Injecting data to a WCF service