为WCF设置Ninject

有没有人有关于如何在WCF中设置Ninject的明确指示? 谷歌搜索,但我看不到有关如何在WCF中使用Ninject的任何更新指南。

将NInject与WCF一起使用与使用任何其他DI容器相同。 为此,您需要使用3个WCF扩展点: InstanceProviderServiceHostServiceHostFactory

自定义InstanceProvider将用于通过使用带参数的构造函数来创建服务实例。 代码如下所示。

 public class NInjectInstanceProvider : IInstanceProvider, IContractBehavior { private readonly IKernel kernel; public NInjectInstanceProvider(IKernel kernel) { if (kernel == null) throw new ArgumentNullException("kernel"); this.kernel = kernel; } public object GetInstance(InstanceContext instanceContext, Message message) { //delegate to GetInstance(InstanceContext) return GetInstance(instanceContext); } public object GetInstance(InstanceContext instanceContext) { //resolve the service instance return kernel.Get(instanceContext.Host.Description.ServiceType); } public void ReleaseInstance(InstanceContext instanceContext, object instance) { kernel.Release(instance); } public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) { dispatchRuntime.InstanceProvider = this; } public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) { } } 

然后,此自定义实例提供程序将应用于ServiceHost类中的每个合同。 这是通过使用合同行为来完成的。 这就是实例提供程序也实现IContractBehavior 。 您可以看到我们在ApplyDispatchBehavior方法中应用实例提供程序。 下面的代码展示了ServiceHostServiceHostFactory实现。

 public class NInjectServiceHostFactory : ServiceHostFactory { private readonly IKernel kernel; public NInjectServiceHostFactory() { kernel = new StandardKernel(); kernel.Bind().To(); //add the rest of the mappings here } protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { return new NInjectServiceHost(kernel, serviceType, baseAddresses); } } public class NInjectServiceHost : ServiceHost { public NInjectServiceHost(IKernel kernel, Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { if (kernel == null) throw new ArgumentNullException("kernel"); foreach (var cd in ImplementedContracts.Values) { cd.Behaviors.Add(new NInjectInstanceProvider(kernel)); } } } 

您可以看到,在ServiceHost构造函数中,我们遍历所有已实现的合同并应用我们需要的行为。 在我们的例子中,这是NInjectInstanceProvider

自定义ServiceHostFactory是创建DI容器并使用映射填充它所必需的。 然后,我们覆盖CreateServiceHost方法,以便提供我们的自定义ServiceHost实现。

此时设置已完成。 您需要做的就是创建一个依赖于IDummyDependency的WCF服务。 另外,不要忘记在svc文件中设置Factory属性,如下所示(右键单击svc文件,然后“查看标记”):

 <%@ ServiceHost Language="C#" Debug="true" Service="Service.DummyService" Factory="Service.NInjectServiceHostFactory" %> 

希望这可以帮助。 此外,我认为NInject在NInject.Extensions.Wcf.dll中提供了一些开箱即用的实现。