Rom*_*meo 11 c# wcf ninject ninject-extensions
有没有人有关于如何在WCF中设置Ninject的明确指示?谷歌搜索,但我看不到有关如何在WCF中使用Ninject的任何更新指南.
flo*_*dea 16
将NInject与WCF一起使用与使用任何其他DI容器相同.要做到这一点,你需要使用3 WCF扩展点:InstanceProvider,ServiceHost和ServiceHostFactory.
自定义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方法中应用实例提供程序.下面的代码介绍了这些ServiceHost和ServiceHostFactory实现.
public class NInjectServiceHostFactory : ServiceHostFactory
{
    private readonly IKernel kernel;
    public NInjectServiceHostFactory()
    {
        kernel = new StandardKernel();
        kernel.Bind<IDummyDependency>().To<DummyDepencency>();
        //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实现.
此时设置已完成.您需要做的就是创建一个依赖于它的WCF服务IDummyDependency.另外,不要忘记Factory在svc文件中设置属性,如下所示(右键单击svc文件,然后"查看标记"):
<%@ ServiceHost Language="C#" Debug="true" Service="Service.DummyService" Factory="Service.NInjectServiceHostFactory" %>
希望这可以帮助.此外,我认为NInject在NInject.Extensions.Wcf.dll中提供了一些开箱即用的实现.