我似乎无法让这三个人一起工作。
我使用1种方法将其缩小为非常简单的服务:
[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以这种方式工作,或者有什么我做错了吗?
答案 0 :(得分:1)
这是 Ninject.Extensions.Wcf.NinjectServiceBehavior 类中的错误。 只需使用以下方法创建自己的 NinjectServiceBehaviorFixed 类,该类来自 IServiceBehavior 接口:
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创建新端点
答案 1 :(得分:-1)
你在哪里设置绑定?在代码的某处,您需要使用kernel
初始化ServiceModule
,如下所示:
_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>();
}
}