私の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 ??
私はそれらを使用しています。どういう意味? –
あなたはそうではありません。実装を見てください。私たちはこのスレッドからそれらを作成しました:https://github.com/ninject/Ninject.Web.WebApi/pull/1 –
イアン、ありがとう。あなたの答えの中のリンクをすぐに見つけられませんでした。私の理解は私の実装で、BeginBlock()がスコープをSingletonに上書きすることが正しいのでしょうか? –