4

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 コード (バインディングの設定用)

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!
      }
   }
}
4

1 に答える 1

0

たぶん、シングルトンサービスを作成したのですか?( InstanceContextMode.Single ) すべての着信呼び出しに対して 1 つの InstanceContext オブジェクトのみが使用され、呼び出し後に再利用されません。サービス オブジェクトが存在しない場合は、作成されます

于 2015-02-02T10:05:16.010 に答える