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