2

サービスインターフェイスの1つにInSingletonScopeを使用しようとしています。ただし、Webリクエストごとにオブジェクトの新しいインスタンスを作成しています。基本的に、それは私のasp.netmvc4アプリケーションのInRequestScopeのように動作します。

InSingletonScopeはIISプロセスの存続期間中のものだと思いましたか?

NinjectModuleの1つに、インターフェイスの次の実装を登録します。すぐに解決すると、repo1とrepo2は実際には同じインスタンスです。ただし、私のコントローラーでは、すべてのリクエストが新しいインスタンスになります。

--------------------モジュール登録

public class RepositoryModule : NinjectModule
{
    #region Overrides of NinjectModule

    public override void Load()
    {
        Bind<IFakeRepository>().To<FakeRepository>().InSingletonScope();

        // following code onle execute the constructor once
        var repo1String = Kernel.Get<IFakeRepository>().GetString();
        var repo2String = Kernel.Get<IFakeRepository>().GetString();
    }

    #endregion
}

--------------------リポジトリのインターフェースと実装

public interface IFakeRepository
{
    string GetString();
}

public class FakeRepository : IFakeRepository
{
    public FakeRepository()
    {
        // every web request execute this constructor
        Debug.Write("FakeRepository constructor called");
    }

    #region Implementation of IFackRepository

    public string GetString()
    {
        return "dummy string";
    }

    #endregion
}

------------------WebAPIコントローラー

public class TestRepoController : ApiController
{
    public IFakeRepository FakeRepository { get; set; }

    public TestRepoController(IFakeRepository fakeRepository)
    {
        FakeRepository = fakeRepository;
    }

    public string Get()
    {
        return FakeRepository.GetString();
    }
}

-----------------WebAPIルート登録

config.Routes.MapHttpRoute(
         name: "TestTakeRoutePost",
         routeTemplate: "Fake",
         defaults: new { controller = "TestRepo" }
        );

----------------- NinjectWebCommon

[assembly: WebActivator.PreApplicationStartMethod(typeof(PNI.MediaServer.Application.App_Start.NinjectWebCommon), "Start")]

[アセンブリ:WebActivator.ApplicationShutdownMethodAttribute(typeof(PNI.MediaServer.Application.App_Start.NinjectWebCommon)、 "Stop")]

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();

        //load all Binds defined in the classes that inherit NinhectModule
        kernel.Load(Assembly.GetExecutingAssembly());

        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        // Set Web API Resolver
        GlobalConfiguration.Configuration.DependencyResolver = new PniNinjectDependencyResolver(kernel);

        return kernel;
    }
}
4

0 に答える 0