問題タブ [ninject-extensions]
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 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 - TaskScheduller を介して Log4Net 拡張機能を使用して Ninject をログに出力せず、エラーも発生しない
Ninject と Log4Net を使用するコンソール アプリケーション プロジェクトがあります。
私のマシンでアプリを実行すると、ログは正常に機能しています。本番サーバーでアプリを実行すると、ログは正常に機能します。他のユーザーによって実行されているように設定されている TaskScheduller タスクを介してプログラムを実行すると、どのアペンダーからもログ出力が得られません。RollingFileAppender、SmtpAppender、および AdoNetAppender を使用しています。奇妙なことに、プログラムは正常に実行されていますが、何もログに記録されません。
ローカルで実行するとアプリが動作するため、log4net の構成は問題ないと思います。
プログラムのメイン メソッドでロガーを解決し、必要に応じてコンストラクター パラメーターを介して挿入します。これは、アプリのメイン メソッドでロガーを取得する方法です。
ヒント、ポインター、または何か....他に何を試すべきかわからないため。
c# - InterceptAttributeを使用してNinjectインターセプトを使用する方法
私は次のようにNinjectWebCommonを持っています。「Timing」属性が設定されているメソッドでTimingInterceptorをトリガーすることができません。すべてのメソッド呼び出しがインターセプトされるクラスレベルでインターセターが定義されている場合は正常に機能しますが、インターセプトするメソッドを指定(オプトイン)できるようにしたいと思います。
Ninject.Extensions.Interception.DynamicProxyが追加されています。
私のサービスクラスは次のように定義します
インターセプターと属性は次のように定義されます
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
ます。
どうすればこのテストに合格できますか?
元の質問を参照する必要がないように、可能な限り凝縮された残りのコードを次に示します。
ninject - オープン ジェネリックで Ninject Factory Extensions の ToFactory メソッドを使用することは可能ですか?
Ninject Conventions ExtensionsとカスタムIBindingGeneratorを使用して実装がバインドされ、 Ninject Factory Extensions のメソッドとカスタム インスタンス プロバイダーを使用してインターフェイスがバインドさ
れている、以前に回答した質問に基づいて構築しています。ICar
ICarFactory
ToFactory()
以前の ではなく に制約されてIVehicleFactory<T>
いるをバインドして使用できるように、リファクタリングしようとしています。このようにして、ファクトリのメソッドで車両タイプの名前を渡す代わりに、ジェネリック型パラメーターで目的の車両を指定できます。T
ICar
ICarFactory
CreateCar()
ToFactory()
この手法を使用して、オープンなジェネリック インターフェイスをバインドすることは可能ですか?
間違ったツリーを吠えているICar
ような気がしますが、名前で型を指定していたときに、ICar
型自体をジェネリック型パラメーターとして指定するのが自然な進化のように思えました...
現在失敗しているテストは次のとおりです。
そしてInvalidCastException
投げられた:
そして工場のインターフェース:
カスタム インスタンス プロバイダーでは、そのブレークポイントでデバッガーを停止することさえできないため、そこで何が起こっているのか本当にわかりません。
編集 1 - IVehicleFactory
署名とカスタム インスタンス プロバイダーの変更
ここでは、IVehicleFactory
署名をジェネリックCreate<T>()
メソッドを使用するように変更し、それ自体に明示的にバインドMercedes
しました。
そして、最初のジェネリック型パラメーターの名前を返す新しいカスタム インスタンス プロバイダー:
これが新しいテストですが、まだ合格していません:
}
ANinject.ActivationException
がスローされます:
Mercedes
明示的に自己バインドしたため、クラスが見つからない理由がわかりません。私が間違っていることを見つけることができますか?
c# - Ninject - リクエスト スコープは既に破棄されています
Ninject
MVC 3 アプリケーションで拡張機能 EventBroker と DependencyCreation を使用しています。Ninject.MVC3 パッケージをインストールして使用しているため、OnePerRequestModule
.
IParentService
コントローラーに呼び出されたサービスを注入しようとしています。DependencyCreation 拡張 (ハード リファレンスなし) を介して作成されたIParentService
依存関係があります。ChildService
どちらのサービスも、ローカルのイベント ブローカ インスタンス (ローカルのParentService
) に登録されています。
IParentService
リクエストごとにスコープを設定し、依存関係とイベント ブローカーを と同時に破棄したいのですIParentService
が、ScopeDisposedException
. 私は何を間違っていますか?
いくつかのコード:
サービス定義:
カーネル登録 (NinjectWebCommon)
スタックトレース:
編集 - 詳細
このエラーは、 への呼び出しで設定された非アクティブ化デリゲート内でスローされますRegisterOnEventBroker
。コードは、イベント ブローカに登録されているすべてのオブジェクトを登録解除しようとします。おそらく親サービスが破棄されたため、イベント ブローカー スコープが破棄されたため、失敗します。私が知る限り、Ninject は Transient スコープ以外の有効期間を持つオブジェクトの OnDeactivation デリゲートのみを呼び出すため、親サービスが登録されているときにこれが機能しないのはなぜでしょうかRequestScope
。この問題が原因でメモリ リークが発生しているため、一時的なスコープは親サービスには十分ではありません。
これは EventBroker 拡張機能のバグではないかと思い始めています。
c# - Ninject コンソール アプリ - DebugException には実装がありませんか?
新しいコンソール アプリ プロジェクトを起動しました。Ninject、Ninject.Extensions.Logging、Ninject.Extensions.Logging.Log4Net を追加しました
次のようにninjectをセットアップしました:
タイプロード例外が発生しています:
アセンブリ 'Ninject.Extensions.Logging.Log4Net、Version=3.0.0.0、Culture=neutral、PublicKeyToken=c7192dc5380945e7' のタイプ 'Ninject.Extensions.Logging.Log4net.Infrastructure.Log4NetLogger' の 'DebugException' には実装がありません。
誰かがこれを修正する方法を知っているかどうか疑問に思っていますか? または、コンソールアプリで使用すべきではないlog4netです..
c# - 慣例によるNinjectバインディングがジェネリック型で機能しない
私は.NET 4.5、Ninject 3を次のように慣例libによるバインディングで使用しています:
そして、これは次の場合に適切にバインドされます:
しかし、バインドしません:
ただし、次のようなジェネリック クラスの特定の実装に個別のバインディングを追加すると、前のバインディングが機能します。
ただし、個々のジェネリック型をそれぞれ追加すると、規則の目的が無効になり、float、int、string などの可能な個々の型ごとにバインディングを追加する必要があります...
私のコマンドの汎用バージョンをサポートするために、規則を変更する方法、または別の規則を追加する方法 (またはまったく異なるソリューションを使用する方法) を知っていますか? つまり、2 レベルのジェネリックをサポートします。