Ninject,WCF&自动发现

时间:2012-07-03 18:09:47

标签: c# wcf ninject ninject-extensions

我似乎无法让这三个人一起工作。

我使用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以这种方式工作,或者有什么我做错了吗?

2 个答案:

答案 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>();
    }
}