問題タブ [ninject-3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ninject - Ninject コンストラクター バインディング
私はNInjectを使用しています。私はこのようなオブジェクトを持っています
魔法だけを渡して foo を注入できるようにしたい。魔法はクラスごとに異なるため、これは異なるインスタンスを返す必要があります。
初めてそれをバインドしようとしたとき、私はやった
しかし、それから私はそれを調べなければなりません。
私は明示的に自分自身を魔法のひもに結びつけたくありません。
ほぼそこにたどり着くような印象をBind<IFoo>().ToConstructor(ctorArg => new Foo(xxx, ctorArg.Kernel.Get<IFoo>());
受けますが、引数を検索するために「xxx」に何を入力すればよいかわかりません。
ninject - Ninject 2+ で明示的にバインドされていないクラスの暗黙的なバインディング/インジェクションを無効にする
NInject からバインドされていないオブジェクトを要求すると、デフォルトの動作は (適切なコンストラクターが利用可能な場合) 適切なオブジェクトのインスタンスを作成するように見えます。
この動作を無効にしたいと思います (モジュールでカスタム バインドを取得するのではなく、何かが自動バインドされていたため、問題をデバッグするのが困難でした)。 この質問はそれが可能であることを示唆していますが、NInject wiki から答えを見つけることができません。
inversion-of-control - 複数の型を 1 つのインターフェイスにバインドするための Ninject Factory 拡張機能を使用した Ninject 規則
私は、Ninject Factory Extension Bind Multiple Concrete Types To One Interfaceというタイトルの SO の質問で尋ねられたシナリオを拡張しようとしています。実装の規則ベースのバインディングに Ninject 規則を使用しICar
ます。
私は、Akim によって作成された受け入れられた回答と、完全な例を概説する彼の Gistに取り組んでいます。
違いは、明示的なICar
バインディングを規約ベースのバインディングに置き換えたことです (または、少なくともそれを試みました;)。
car
テストで変数をインスタンス化しようとすると、次のようになりActivationException
ます。
どうすればこのテストに合格できますか?
元の質問を参照する必要がないように、可能な限り凝縮された残りのコードを次に示します。
asp.net - TypeLoadExceptionをスローするNinject ASP.NET拡張機能
ASP.NET webforms アプリケーションで Ninject 3 を使用しようとしています。必要なすべての場所に新しいインジェクション カーネルを作成することで、しばらく Ninject.Web 拡張機能なしで使用してきました。それが正しいやり方ではないということは、今まで私には思いもしませんでした。Ninject.Web を正常に使用する小さなテスト アプリケーションを作成しましたが、実際のアプリケーションで同じことを実行しようとすると、ページが読み込まれるとすぐに TypeLoadException を受け取ります。ブレークポイントを設定できるコードにも入りません。例外とスタック トレースは次のとおりです。
アセンブリ 'mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089' から型 'System.Runtime.CompilerServices.ExtensionAttribute' を読み込めませんでした。
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.TypeLoadException: アセンブリ 'mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089' から型 'System.Runtime.CompilerServices.ExtensionAttribute' を読み込めませんでした。
ソース エラー:
現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。
スタックトレース:
[TypeLoadException: アセンブリ 'mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089' から型 'System.Runtime.CompilerServices.ExtensionAttribute' を読み込めませんでした。]
System.ModuleHandle.ResolveType(RuntimeModule モジュール、Int32 typeToken、IntPtr * typeInstArgs、Int32 typeInstCount、IntPtr* methodInstArgs、Int32 methodInstCount、ObjectHandleOnStack タイプ) +0
System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule モジュール、Int32 typeToken、RuntimeTypeHandle[] typeInstantiationContext、RuntimeTypeHandle[] methodInstantiationContext) +525
System.ModuleHandle.ResolveTypeHandle(Int32 typeToken 、RuntimeTypeHandle[] typeInstantiationContext、RuntimeTypeHandle[] methodInstantiationContext) +19
System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +315
System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport スコープ, Assembly& lastAptcaOkAssembly, RuntimeModule decorModule, MetadataToken decorToken, RuntimeType attributeFilterType, Boolean mustBeInheritable、Object[] 属性、IList 派生属性、RuntimeType& attributeType、IRuntimeMethodInfo& ctor、Boolean& ctorHasParameters、Boolean& isVarArg) +208
System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoredModule, Int32 decorMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) +1171 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly アセンブリ, RuntimeType caType) +146
WebActivator.AssemblyExtensions .GetActivationAttributes(アセンブリ アセンブリ) +114
WebActivator.ActivationManager.RunActivationMethods() +286
WebActivator.ActivationManager.RunPreStartMethods() +38
WebActivator.ActivationManager.Run() +56[InvalidOperationException: 型 WebActivator.ActivationManager でのアプリケーション開始前の初期化メソッド Run は、次のエラー メッセージで例外をスローしました: 型 'System.Runtime.CompilerServices.ExtensionAttribute' をアセンブリ 'mscorlib、Version=4.0.0.0、Culture から読み込めませんでした=neutral, PublicKeyToken=b77a5c561934e089'..]
System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 メソッド) +11567502
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +465
System.Web.Hosting.HostingEnvironment.Initialize( ApplicationManager appManager、IApplicationHost appHost、IConfigMapPathFactory configMapPathFactory、HostingEnvironmentParameters、hostingParameters、PolicyLevel policyLevel、例外 appDomainCreationException) +1167[HttpException (0x80004005): 型 WebActivator.ActivationManager で実行されるアプリケーション前の開始初期化メソッドは、次のエラー メッセージで例外をスローしました: 型 'System.Runtime.CompilerServices.ExtensionAttribute' をアセンブリ 'mscorlib、バージョン = 4.0 から読み込めませんでした。 0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089'..]
System.Web.HttpRuntime.FirstRequestInit(HttpContext コンテキスト) +11556592 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext コンテキスト) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr、 HttpContext コンテキスト) +4813333
私の検索では、それほど役立つものは見つかりませんでしたが、私が調査した主な方法は、Ninject が構築された .NET のバージョンと実際に実行しているバージョンとの間の潜在的な競合です。システムに .NET 4.5 をインストールしたことがないので、4.0 に対してビルドしていることは確かです。次に、最新バージョンの Ninject (3.0.2) とソースからの拡張機能をビルドして、4.0 も使用していることを確認しました。また、実際のアプリで使用しているすべてのライブラリをテスト アプリに追加して、競合があるかどうかを確認しようとしましたが、何も起こりませんでした。(ただし、それらを実行するコードを入れるところまでは行きませんでした。それによって何かが変わるかどうかはわかりません。)
誰かがこの種の問題を見たことがありますか、または私が試すことができるアイデアはありますか? 私が提供できる役立つ情報は他にありますか?
あるいは、ninject.web 拡張機能の代わりに、ASP.NET アプリケーションで Ninject を使用できる他の方法はありますか? Ninject カーネルをシングルトンにラップしても同じように動作しますか?
ninject - Ninject.Activation.IRequest Target プロパティが null になる原因
おそらく簡単な質問ですが、ドキュメントや SO で直接答えられるものは見つかりませんでした。
初めてNinjectWhen(Func<IRequest, bool> condition)
拡張メソッドを使用する必要があり、null オブジェクトの例外で少しハングアップしました。IRequest.Target
プロパティが nullの場合があることがわかり、null のチェックを使用する他の 例もいくつか見ました。When
Target
Ninject が の値を持たずにコールバックを実行する条件に興味がありますTarget
。フォームのバインディングを作成する場合
私は当初、バインディングが実行されているときに有効なTarget
型が常に存在すると誤って想定していました。T1
asp.net-mvc - Ninject 3 の複数のバインディング
私の質問は、ここに投稿された古い質問の繰り返しです: Ninject 2.2 multiple bindings
誰かが2011年にこれに対処しようとしていたようです.Ninjectでそのような警告をオフにする方法があるかどうか誰か知っていますか? または他の回避策はありますか?
編集
@BatteryBackupUnitへの対応として、ここに私の正確な問題があります:
私は複数のライブラリを持っています...そして私のコアライブラリでは、次のようなことをしています:
- ホスト アプリケーション (ホストを含む) によって参照されるすべてのアセンブリを検索します。
IDependency
これらすべてのアセンブリから継承するすべての型を検索します。- それらすべてをトランジェントとして自動的に登録します
次に、別のライブラリ(ホストアプリによって参照される場合とされない場合があります)から、これがあります:
ここIDbContextFactory
にも があるIDependency
ため、コア ライブラリによって既に読み込まれているため、ここに登録しますが、スコープは異なります (シングルトン)。
経験から (そして以前にテストしたことから)、Autofac ではこれが問題ではないことはわかっていますが、Ninject では既に登録されているというエラー メッセージが表示されます。
理想的には、以前の登録を上書きする方が良いでしょう...「カスケードスタイル」(より良いフレーズがないため)..
ninject - Ninject カーネルでスコープ外のオブジェクトを破棄する
カーネルがその中にあるオブジェクトをどのように処分したかを理解しようとしています。たとえば、次のコードは 2 つのスコープを作成し、スコープが同じ場合は同じオブジェクトを解決し、スコープが異なる場合は別のオブジェクトを解決することをアサートします。
スコープが 2 つあるRedBall
ため、コンテナーには 2 つのインスタンスが保持されます。
- これらは\いつどのように削除されますか?
- コンテナ内のボールが廃棄されたことを証明するためにテストを拡張するにはどうすればよいですか?