[英]Ninject, WCF & Auto Discovery
我似乎无法让这3个人一起工作。
我通过一种方法将其范围缩小到一个非常简单的服务:
[System.ServiceModel.ServiceContract]
public interface Icontract
{
[System.ServiceModel.OperationContract]
void Ping();
}
public class contract : Icontract
{
public void Ping()
{ }
}
我有一个看起来像这样的工厂:
public class ServiceFactory
{
private readonly IKernel _kernel;
public ServiceFactory(IKernel kernel)
{
_kernel = kernel;
}
public NinjectServiceHost<T> GetService<T>()
{
return _kernel.Get<NinjectServiceHost<T>>();
}
}
如果我像这样创建服务...
_tmp = new ServiceHost(typeof(ConsoleApplication1.contract));
_tmp.Open();
...发现工作正常。 但是如果我像这样使用工厂...
_tmp = _factory.GetService<ConsoleApplication1.contract>();
_tmp.Open();
...该服务不再可发现。 有关该服务的所有其他操作均按预期进行 。
任何人都可以通过发现以这种方式工作Discovery感到高兴,还是我做错了什么?
这是Ninject.Extensions.Wcf.NinjectServiceBehavior类中的错误。 只需使用以下方法创建从IServiceBehavior接口派生的NinjectServiceBehaviorFixed类:
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (EndpointDispatcher endpointDispatcher in serviceHostBase.ChannelDispatchers.OfType<ChannelDispatcher>().SelectMany(channelDispatcher => (IEnumerable<EndpointDispatcher>) channelDispatcher.Endpoints))
{
if (endpointDispatcher.DispatchRuntime.InstanceProvider == null)
{
endpointDispatcher.DispatchRuntime.InstanceProvider = _instanceProviderFactory(serviceDescription.ServiceType);
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(_requestScopeCleanUp);
}
}
}
添加到您的NinjectModule代码:
Unbind<IServiceBehavior>();
Bind<IServiceBehavior>().To<NinjectServiceBehaviorFixed>();
在ApplyDispatchBehavior方法中,我们只是添加了一个检查endpointDispatcher.DispatchRuntime.InstanceProvider是否为null的问题,因为WS-Discovery使用定义的InstanceProvider创建了新的端点,不应将其覆盖
您在哪里设置绑定? 您需要在代码中的某个位置使用ServiceModule
初始化kernel
,如下所示:
_kernel = new StandardKernel(new YourNinjectModule());
然后在模块代码中:
public class YourNinjectModule: NinjectModule
{
/// <summary>
/// Loads the module into the kernel.
/// </summary>
public override void Load()
{
// ===========================================================
//
// Bind dependency injection.
// Add entries in here for any new services or repositories.
//
// ===========================================================
this.Bind<Icontract>().To<contract>();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.