問題タブ [ninject-conventions]
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.
asp.net-mvc-3 - ninjectおよびconventionベースのバインディングを使用したアプリケーション設定の処理
私はMVC3アプリケーションでNinjectを使用しており、ninject.extensions.conventionsを使用したコンベンションベースのバインディングに切り替えようとしています。
ここで、次のようなアプリケーション設定にアクセスする必要があるクラスがあるとします。
私はこのようにNinjectで通常のバインディングを行う方法を理解していると思います:
しかし、代わりに規則を使用してこれを行うにはどうすればよいですか?
必要に応じて追加情報:
私はnugetNinject.MVC3パッケージを使用しており、App_Start / NinjectWebCommon.csのRegisterServicesでは、これが現在持っているすべてです。
c# - Ninject を使用したコンストラクター文字列引数の規約ベースのバインディング
プロジェクトで IoC コンテナーとして Ninject を使用しています。私は次のクラスを持っています:
私のアプリケーション設定ファイルには、「someDatabase」という名前の接続文字列があります。デフォルトでは、この接続文字列をコンストラクターに挿入するには、次の構成を追加する必要があります。
しかし、私はそのような文字列の従来のベースのバインディングを実装したいと考えています。名前が「ConnectionString」で終わる文字列型のすべてのコンストラクター パラメーターの値は、アプリケーションの connectionStrings 構成セクションから取得され、自動的に挿入される必要があります。appSettings セクションにも同様の規則を実装したいと考えています。このアプローチについては、Mark Seeman の記事「プリミティブの依存関係」 (「プリミティブの規約」セクション)で詳しく説明しています。例では Castle Windsor コンテナが使用されました。
Ninjectを使用してそのような規則を実装することは可能ですか?これを行う最良の方法は何ですか? 私はすでに ninject.extensions.conventions を試しましたが、そのような機能はないようです。
ninject - Ninject MetaData 制約付き Get() は子の解決に適用されますか?
ninject.extensions.conventions
特定のアセンブリ内のすべての実装をバインドし、バインディングのメタデータとしてアセンブリ名でタグ付けするために使用しています。Get を使用してこれらのアイテムを引き出すことができ、標準として func を提供します。
私が知りたいのは、この関数が解決されたすべての子にも適用されるということですか? 私の心配は、私のロジックは今は機能していますが、子供たちを満たすバインディングを複数回追加すると、ninject がスローされることです。
コードサンプル:
上記のサンプルに基づいて、メタデータ フィルターに基づいて IRootDependency が正しいバインディングに解決されることがわかります。
私が見つけようとしているのは、次の真実です。
このフィルターは、依存関係チェーンをフィードしません。IChildDependency は例外をスローします。これは、バインディングで MetaData が指定されていてもクエリされないためです。
ninject - Ninject 規則と傍受
インターセプト用の属性でサービスを装飾し、規約ベースのバインディングでインターセプターを設定したいと考えています。自分の属性を傍受属性から継承したくありません...回避できれば。
たとえば、次のクラスがあります。
これを次のようにバインドできることを理解しています。
属性とインターセプターのさまざまな組み合わせでこれを行うにはどうすればよいですか? 例えば:
Log 属性と Authorize 属性がある場合、3 セットのバインディングを構成する必要がありますか? (認証なしのログ用に 1 つ、ログなしの認証用に 1 つ、ログと認証の両方用に 1 つ)。
更新:元の質問パラメーターに基づく解決策を見つけることができませんでしたが、同様の質問に出くわし、最終的に解決策にたどり着きました。ソースコードは次のとおりです。
注: Common.Interception.Interceptors名前空間は、Ninject.Extensions.Interception (および必要なすべての依存関係) への参照を持つアセンブリ内にあります。私の属性は、独自の依存関係のない別のアセンブリで定義されています。
MiscExtensions.cs
AlternateInterceptorRegistrationStrategy.cs
IInterceptorConfig.cs
InterceptorConfig.cs
TraceInterceptor.cs - サンプル インターセプター
注:アトリビュート/インターセプターを接続する方法を示す簡単なコンソール アプリを次に示します。これには、Ninject.Extensions.Interception.DynamicProxy と Ninject.Extensions.Conventions (およびそれらに必要なすべての依存関係) の両方に対する依存関係があります。
ninject - Ninject Conventions拡張機能を使用してジェネリック型を継承にバインドするにはどうすればよいですか?
Ninject ConventionsInitializerForXXX
を使用して(非ジェネリック実装)をIInitializer<XXX>
(ジェネリックインターフェイス)
にバインドして、名前がInitializerForで始まり、次のように終わる非ジェネリック実装を解決するようにするにはどうすればよいですか?IInitializer<T>
typeof(T).Name
非抽象クラスが直接実装されておらずIInitializer<T>
、一部の実装が他の実装から継承している場合:
InitializerForShadeOfBlue
から継承InitializerForBlue
InitializerForBlue
抽象から継承Initializer<Blue>
- 抽象
Initializer<T>
は直接実装しますIInitializer<T>
ShadeOfxxxの静脈には文字通り何百もの初期化子があるので、使用できる.EndsWith(typeof(T).Name)
特定IInitializer<T>
の規則にを使用できることを望んでいます。それらすべてをマップする必要がある場合は、実行時にリフレクションを使用して解決する方法を見つけたほうがよいでしょう。
次の場合:
更新:カスタムバインディングジェネレーターを使用したバインディング(実装については、以下の私の回答を参照してください)
主な方法
イニシャライザファクトリ
イニシャライザ
コンテンツモデル
ninject-extensions - Ninject カスタム インスタンス プロバイダを使用して、ファクトリ メソッド引数を使用して正常にバインドし、解決する
私は、具象ファクトリが具象実装の名前付きバインディングに一致するファクトリメソッドの文字列引数に基づいて実装を返すと信じている同様の質問に対するこの受け入れられた回答を研究してきました。
ファクトリが抽象ファクトリである場合に、もう少し複雑な例を適切に動作させるのに苦労しており、Ninject 規則ベースのバインディングを使用したいと考えています。次のテストを検討してください。
インターネットで一度見たので、たいまつとナイフでジャグリングを試みます。
bicycleBuilderFactory
このエラーで割り当てようとすると、刺されて炎上します。
型を解決するために、ファクトリ メソッド引数( )とジェネリック型引数( )を使用して、メソッドとカスタム プロバイダーを使用してバインドすることは可能ですか? ToFactory()
"Germany"
IVehicleBiulder<BlueBicycle>, BlueBicycle
テスト用の残りのコードは、できるだけコンパクトで読みやすいものです。
VehicleBuilder の実装
車両の実装:
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
ます。
どうすればこのテストに合格できますか?
元の質問を参照する必要がないように、可能な限り凝縮された残りのコードを次に示します。
entity-framework - EF4.1 コンテキスト + Ninject コンボのメモリ リークを修正
NCron を使用していくつかのジョブを定期的に実行する Windows サービスがあります。私は最近 Ninject を導入しましたが、EF コンテキスト (EF4.1 の ObjectContext) が GC されていない (メモリ プロファイルを作成した) ため、重大なメモリの問題が発生しました。
これらのジョブの一部は非常に長時間 (10 ~ 15 分) 実行され、データベースを集中的に使用することに注意してください。EF がおそらくこの種の作業に最適なソリューションではないことはわかっていますが、現時点でリファクタリングすることは不可能です。
この件に関してかなりの資料を見つけたので、次のように進めました。
- ジョブ クラスに INotifyWhenDisposed を実装する
- 名前付きスコープで EF コンテキスト バインディングを定義しようとしています。ジョブが終了したときに破棄され、適切に GC されることを期待しています。
名前付きスコープが存在しないという ActivationException が発生します。
これを複製するデバッグモードで試した簡単なコードを次に示します。
その後
簡潔にするために残りをカットしました。
私は何を間違っていますか?
更新 1 - コンストラクター インジェクションが機能します。明示的.Get<T>
に例外が発生したときです。