2012-11-14 8 views
5

私のasp.net WebApiプロジェクトは、サービス、コア、データアクセス用の複数のアセンブリで構成されています。 NinjectをプロジェクトのDIコンテナとして使用しようとして、NuGetのNinject.Web.Commonパッケージを追加しました。ここに私のNinject.Web.Common.csあるNinject 3 - BeginBlock()はasp.net WebAPIのInRequestScopeをオーバーライドしますか?

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
{ 
    readonly IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) : base(kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectDependencyScope(this.kernel.BeginBlock()); 
    } 
} 

public class NinjectDependencyScope : IDependencyScope 
{ 
    IResolutionRoot resolver; 

    public NinjectDependencyScope(IResolutionRoot resolver) 
    { 
     this.resolver = resolver; 
    } 

    public object GetService(System.Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     var resolved = this.resolver.Get(serviceType); 
     return resolved; 
    } 

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     return this.resolver.GetAll(serviceType); 
    } 

    public void Dispose() 
    { 
     IDisposable disposable = resolver as IDisposable; 
     if (disposable != null) 
      disposable.Dispose(); 

     resolver = null; 
    } 
} 

:その後、私はとIDependencyResolver実装されています。

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(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
     RegisterServices(kernel); 

     GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(x => 
      x.FromAssembliesMatching("WebApiTest.DataAccess.dll") 
      .SelectAllClasses() 
      .BindAllInterfaces() 
      .Configure(config => config.InRequestScope())); 

     kernel.Bind(x => 
      x.FromAssembliesMatching("WebApiTest.*.dll") 
      .SelectAllClasses() 
      .BindAllInterfaces() 
      .Configure(config => config.InTransientScope())); 
    }   
} 

私の質問はNinjectDependencyResolverのコードについてです - > BeginScope()メソッド:新しいNinjectDependencyScope(this.kernel.BeginBlockを())を返します。

WebApiTest.DataAccess.dllに実装されているリポジトリにリクエストのスコープを設定したいと考えています。ネイトコハリからこのpostを見つけました。私はポストは古いと認識していますが、アクティベーションブロックの説明は、それが現在の実装であるかどうか疑問に思っています。

Ninject2の有効範囲を処理する方法の1つは、アクティブ化ブロックです。ブロックは、バインディングで宣言されたスコープをオーバーライドする代わりに、>起動されたインスタンスをブロック自体に関連付ける方法です。 ...

したがって、私のリポジトリの実際の範囲は何ですか?

また、BeginBlock()の使用は任意であることを私に聞こえるが、私はそれを削除すると、コントローラへの最初の呼び出しは成功しますが、任意の後続の呼び出しが例外をスロー:

Ninjectコンポーネントの命令キャッシュはありませんようにとコンポーネントがカーネルのコンポーネントコンテナに登録されている。

WHY ??

答えて

13

今のNinjectのInRequestScope()を使用して設定したがGetDependencyScope()

は、私は一緒に入れて使用して要求をそれらをやってのけるしていないリクエストスコープでの依存関係を使用するためには、この NinjectDependencyResolverこのNinjectDependencyScope実装

+0

私はそれらを使用しています。どういう意味? –

+0

あなたはそうではありません。実装を見てください。私たちはこのスレッドからそれらを作成しました:https://github.com/ninject/Ninject.Web.WebApi/pull/1 –

+0

イアン、ありがとう。あなたの答えの中のリンクをすぐに見つけられませんでした。私の理解は私の実装で、BeginBlock()がスコープをSingletonに上書きすることが正しいのでしょうか? –

関連する問題