有没有人有关于如何在WCF中设置Ninject的清晰指导?我已经Google了一圈,但是我没有看到任何关于如何在WCF中使用Ninject的更新指南。
有没有人有关于如何在WCF中设置Ninject的清晰指导?我已经Google了一圈,但是我没有看到任何关于如何在WCF中使用Ninject的更新指南。
使用NInject与WCF的方法与使用其他依赖注入容器相同。为此,您需要使用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
实现。
此时设置已经完成。您只需要创建一个具有对IDummyDependency
的依赖项的WCF服务。还要不要忘记像下面这样设置svc文件中的Factory
属性(右键单击svc文件,然后选择“查看标记”):
<%@ ServiceHost Language="C#" Debug="true" Service="Service.DummyService" Factory="Service.NInjectServiceHostFactory" %>
希望这能帮到您。此外,我认为NInject在NInject.Extensions.Wcf.dll中提供了一些开箱即用的实现。