wcf - WCF 服务中的 NinjectServiceHost 不调用 Dispose()

标签 wcf ninject ninject-extensions

我一直在尝试在使用 Ninject 的 NinjectServiceHost 时调用我的 IDisposable WCF 服务上的 Dispose 方法,但没有任何运气。然后我下载了 Ninject.extensions.WCF 示例代码并尝试调用 IDisposable TimeService 的 Dispose() 方法,但它也没有被调用。

该服务已正确实例化,只是没有调用 Dispose()。

这是一个错误还是我自己和示例代码丢失的东西?

我创建了一个精简的服务和测试主机来重现该问题。代码如下。

我正在使用 Ninject 3.0.1.10、Ninject.extensions.WCF 3.0.0.5、.net 4.5

ServiceModule.cs 代码(用于设置绑定(bind))

using Ninject.Modules;

namespace TestNinjectWcf
{
   public class ServiceModule : NinjectModule
   {
      public override void Load()
      {
         Bind<Service1>().ToSelf(); 
         // I've also tried Bind<IService1>().To<Service1>()
         // and also tried various scopes such as InParent() and InRequestScope()
      }
   }
}

控制台测试程序来启动服务。
using System;
using Ninject.Extensions.Wcf;
using Ninject;
using TestNinjectWcf;

namespace TestConsole
{
   class Program
   {
      static void Main(string[] args)
      {
         var kernel = new StandardKernel(new ServiceModule());
         var service = kernel.Get<NinjectServiceHost<Service1>>();
         service.Open();
         Console.WriteLine("Service Started");
         Console.ReadKey();
         service.Close();
      }
   }
}

服务实现
using System;
using System.Diagnostics;
using System.ServiceModel;

namespace TestNinjectWcf
{
   [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
   public class Service1 : IService1, IDisposable
   {
      public Service1()
      {
         Debug.WriteLine("Constructor");
      }

      public string GetData(int value)
      {
         return string.Format("You entered: {0}", value);
      }

      public void Dispose()
      {
         Debug.WriteLine("Dispose");  // This line never gets called!
      }
   }
}

最佳答案

也许是您创建了单例服务? (InstanceContextMode.Single)
只有一个 InstanceContext 对象用于所有传入调用,并且不会在调用后回收。如果服务对象不存在,则创建一个

关于wcf - WCF 服务中的 NinjectServiceHost 不调用 Dispose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17779709/

相关文章:

c# - 当通过 WCF 发送对象时,如何处理 LINQ to SQL DataContext 中的关系成员?

multithreading - WCF服务和请求排队

c# - Ninject,使用两种方式的属性注入(inject)来解决循环依赖

c# - 注入(inject) ActivationException : Error activating IAlertManagement

Ninject + Web API 2 : Error activating IFilterProvider using binding from IFilterProvider to DefaultFilterProvider

c# - Ninject 按约定绑定(bind)不适用于泛型类型

.net - 具有两个不同客户端的两种绑定(bind)类型的 WCF 服务

c# - 使用 Ninject 和 Ninject.Extensions.Nlog2 的空引用异常

asp.net - 使用 Web Api、SignalR、MVC 和 OWIN 进行 Ninject

.net - 在 Silverlight 和 "plain vanilla".Net 之间共享程序集