問題タブ [light-inject]
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.
c# - タイプの解決時に LightInject IoC コンテナがスタックオーバーフローをスローする
LightInject IoC コンテナhttp://www.lightinject.net/を試すと、タイプ ISomeService を解決するときに stackoverflow 例外がスローされます。
すべてのタイプが App_Start に登録されています。
そして、コントローラーで解決しようとすると失敗し、stackoverflow 例外がスローされます。
ServiceLocator を使用すると、同じエラーが発生します。
追跡したところ、LightInject ServiceContainer クラスで失敗していることがわかりますが、まだ失敗する理由はわかりません。
GetDefaultDelegate を呼び出した後、実行パスは再び GetInstance で終了し、無限ループとスタック オーバーフローが発生します。
EDIT 2 - これをさらに追跡したところ、コンストラクターとプロパティ注入の両方を同時に持つ SomeService が原因のようです:
依存関係 IAnotherService AnotherService は、コンストラクターとプロパティを介して注入されていますが、プロパティ インジェクターを使用する意図はありませんでした。
編集3
アプリには ServiceLocator を使用するレイヤーがいくつかあるため、最初に NuGet を使用して LI を独自のプロジェクトに追加しました。
ただし、サービス ロケーター プロバイダーは UI レイヤーで設定できるため、実際には独自のプロジェクトに追加する必要はありません。
そのため、余分なプロジェクトを削除し、代わりに NuGet パッケージを UI レイヤーに配置しました。LightInject.Annotation もインストールし、container.EnableAnnotatedPropertyInjection() メソッドを意図的に呼び出さないようにして、コンストラクター インジェクションのみが使用されるようにしました。まだスタックオーバーフローをスローしています。
解決が機能しているかどうかをテストするために、 HomeController.Index() メソッドでこれを実行しています。
コンソール ロギングを ServiceController.GetInstance メソッドに追加して、stackoverflow の原因となったメソッド呼び出しの流れを確認できるようにしました。これはログであり、結果は少し予想外です。ISomeService の CreateDelegate() を呼び出すと、最初に HomeController のインスタンスを取得しようとすることがわかります。なぜでしょうか?
サービスのコンストラクターをコメント アウトすると、解決が機能し、すべての依存関係がプロパティ インジェクションによって解決されます。コンストラクターが含まれている場合、stackoverflow 例外がスローされます。
ISomeService の解決はプロパティのみを使用する場合に機能しますが、そのサービスの依存関係に ISomeService が含まれている場合、IAnotherService を解決できません。上記のログが問題を明らかにすることを願っています。これまでのところ、LightInject のパフォーマンスは Unity よりも大幅に優れています
c#-4.0 - コンストラクターのパラメーターを渡すときに LightInject にサービスを登録するときに有効期間を指定しますか?
LightInject を使用して、複数のコンストラクター パラメーターで登録したいサービスがあるとします。例:
登録時に ILifetime インスタンスを指定する方法を理解するのに苦労しています。簡単な登録を使用すると、次のように簡単な登録に ILifetime を設定できます。
ファクトリを使用するすべての Register メソッドは、一時的なオブジェクトを想定しているようです。
パラメータ用に別のインターフェイスを作成して登録することもできますが、コンストラクタで複数のパラメータを使用するインスタンスごとに新しいものを作成したくありません。
では、ファクトリーとライフタイムにサービスを登録するにはどうすればよいでしょうか?
私は IoC/DI にやや慣れていないことを認めます。これは、このタスクを適切に達成する方法を誤解していることが原因である可能性があります。これを行う別の方法もあると確信しています。
c# - Windsor の Kernel_ComponentRegistered と同様の Lightinject
Castle を使用したチュートリアルのDependency Injection と Unit of Work に従っています。プロジェクトで lightinject を使用しているため、IWindsorInstaller の代わりに ICompositionRoot を使用しています。
問題は、インターセプターを追加するための Kernel_ComponentRegistered に似たメソッドが見つからないことです。lightinjectでそれを行うにはどうすればよいですか?
ioc-container - LightInject と Nsubstitute を使用したオートモックの方法は?
私は両方のライブラリに不慣れで、大規模なプロジェクトでの使用にコミットする前に、単体テストでのローコード作業の自動モックのオプションを明確にする必要があります。
Google でしばらく時間を費やした後、他の IOC とモッキング製品の組み合わせとは異なり、LightInject+Nsubstitute がユニットの手配段階で何もしないデフォルト モックの宣言を簡素化するための既製のプラグイン ライブラリは利用できないと結論付けました。テスト。
単体テストの範囲だけのために LightInject コンテナーを一時的な拡張モック オブジェクトでオーバーライドする方法について LightInject のドキュメントを読みましたが、単体テストが触れる可能性のある何もしない既定の分離モックについてはどうでしょうか。LightInject コンテナ内での作成を自動化する方法はありますか?
私が探している内部 IOC コンテナーの動作は次のとおりです。
LightInject の IProxy と Interceptors は、いくつかの内部モック オブジェクト ビルディング ブロックを提供しているようですが、比較すると Nsubstitute ライブラリはフル機能を備えています。
デフォルトで何を意味するのかを明確にし、モックと拡張モックを行いません。
明らかに、2 番目の拡張タイプのモックは、単体テストごとにローカルで作成する必要があります。
light-inject - DependencyResolver での LightInject の問題
lightinject の設定を別のクラスに書きました。
Global.ascx Application Start で私が持っている
私の LightInjectDependencyResolver クラスは次のようになります。
エラーで死の黄色い画面が表示されます:
タイプを解決できません: System.Web.Mvc.IControllerFactory、サービス名:
編集
私はそれをソートしたと思います、そして基本的に私はDependecnyReolverを必要とせず、これを内部的に行うように見えます。したがって、次のようなことを引き続き行うことができます。
c# - lightinject でファクトリをインターセプトする方法
ここで何をすべきかわからない。invocationInfo.Proceed() は、コンストラクター インジェクションを持つファクトリをインターセプトしようとすると常に失敗します。
私のインターセプターのこのメソッドで失敗します。
例外:
タイプ 'System.InvalidCastException' の例外が LightInject.dll で発生しましたが、ユーザー コードで処理されませんでした
追加情報: タイプ 'System.Func`1[ConsoleApplication1.IAwesome]' のオブジェクトをタイプ 'System.Object[]' にキャストできません。
Lightinject の新しいタグを作成できませんでした。十分な担当者:/
c# - なぜ LightInject は単純な辞書ではなく、ImmutableHashTree を使用して登録を保存するのですか?
仕事で使用するものを選択するために、いくつかの IoC コンテンツを調べています。LightInject のコードベースを調べていると、理解できないものに出会いました...
ServiceContainer のGetInstance(Type serviceType, string serviceName)
メソッドでは、パラメーターからキーを形成し、「namedDelegates」で「Search」を呼び出します。
namedDelegates は、ImmutableHashTree<TKey, TValue>
(独自のコメントから) を実装する内部クラスです。
私が LightInject を見ている理由は、Daniel Palme の IoC Performance Comparisonでの優れたスコアのためであり、この場合、O(1) 辞書を使用するよりも O(log n) バイナリ検索アルゴリズムが望ましい理由について困惑しています。 ?
ここで教えてくれる人はいますか?