問題タブ [autofac]
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.
dependency-injection - Autofacは自動セルフバインディングを実行できますか?
一部のDIフレームワークがこれをサポートしていることは知っていますが(Ninjectなど)、Autofacで可能かどうかを具体的に知りたいと思います。
Autofacコンテナーに具象クラスを要求し、その具象クラスを登録せずに、適切なコンストラクター依存関係がすべて注入されたインスタンスを取得できるようにしたいと思います。つまり、明示的にバインドしない場合は、呼び出した場合と同じように、具象クラスをそれ自体に自動的にバインドします。builder.Register<MyClass>();
これが役立つ場合の良い例は、ViewModelsです。MVVMでは、ビューのみがViewModelに依存し、ルーズタイピングを介してレイヤー化され、ビューの単体テストは行われません。したがって、テストのためにViewModelをモックする必要はありません。したがって、各ViewModelのインターフェイスを用意する必要はありません。したがって、この場合、「このクラスに解決するためにこのインターフェースを登録する」という通常のDIパターンは、不必要な複雑さではありません。のような明示的な自己バインドbuilder.Register<MyClass>();
も、具象クラスのように単純なものを扱う場合、不要なステップのように感じます。
Autofacドキュメントのリフレクションベースの登録例を知っていますが、それも私の好みではありません。考えられるすべてのクラスを事前に登録することの複雑さ(および遅さ)は望んでいません。フレームワークが必要なときに必要なものを提供してくれるようにしたい。設定より規約など。
Autofacを設定して、「これは具体的なタイプで、まだ誰も登録していないので、デフォルト設定で登録されたように動作します」と表示されるようにする方法はありますか?
c# - Autofacを使用したジェネリックインターフェイスの解決
次のコードが与えられた場合、autofacで正しいSomeInstanceを解決するにはどうすればよいですか?
サブクラスのジェネリックのタイプに基づいてSomeInstance1または2を選択したいと思います。
たとえば、サブクラスのコレクション(SubClass1、2 ....)があり、それらを反復処理しながら、適切なSomeInstanceクラスを選択したいとします。
c# - Autofacテストすべての登録済みタイプを解決できます
Autofacに登録されているタイプがたくさんあり、依存関係のいくつかはかなり深いものです。登録されているすべてのタイプを解決できることをテストするための組み込みの方法はありますか?アプリケーションの起動時に早く失敗したいのですが、途中で数分後ではありません。
これは私が現在行っていることであり、うまくいくようですが、それでももっと良い方法はないのだろうかと思います。
c# - Autofac パラメーターの受け渡しとオートワイヤー
Autofac で渡されるパラメーターについて理解できません。次のコードは機能しません。
それはスローします:
ただし、次のコードは機能します。
asp.net-mvc - AUTOFACを使用したASP.NETMVC-カスタムエラーメッセージが表示されなくなりました
カスタムエラーメッセージが途中で機能しなくなり、このエラーが発生します。何か案は?
Autofac.ComponentNotRegisteredException:要求されたサービス'controller.error.aspx'は登録されていません。
私はこれまでそれらを登録するために何もしていません。
カスタムエラーメッセージについていくつか質問がありましたが、それらの応答に記載されている他の問題は見つかりませんでした。
編集:web.configで「On」と「RemoteOnly」を試しました。SharedフォルダーにError.aspxがあります。[ErrorHandler]属性を使用しています。これは長い間機能し、Global.asaxのAutofac構成にいくつかの変更を加えたときにおそらく機能を停止しました。登録されていないサービスに関するエラーメッセージは、エラーが機能を停止すると同時に開始されました。これをAutofacに登録する方法がわかりません。
asp.net - autofac、ASP.NET統合、および破棄
Autofacの初心者はここにいますが、私はこれまでに見たものが好きです。解決されたオブジェクトのリクエストの有効期間を利用しようとしていますが、リクエストが実行された後に破棄が実際に行われていることを確認するのに問題があります。
ページリクエストの最初に取得し、最後に破棄する使い捨てオブジェクトがあります。現在、autofacを使用してオブジェクトのインスタンスを取得していますが、autofacが処理を実行するかどうかを確認したいと思いました。
問題のオブジェクトにDispose()メソッドをインストルメントしましたが、ページがライフタイム管理を行うと、「fire」であることがわかります。私が自分自身を処分しないとき、私は証拠を見ませんが、autofacにそれをさせます。
これらの手順を使用して、web.configやglobal.asaxの変更など、thignsを構成しています。オブジェクトをうまくインスタンス化することはできますが、実際に破棄されているかどうかはわかりません。別のステップはありますか?
asp.net - autofac、ASP.NET 統合、および HttpRequestScoped
HTTP リクエストの終了時に autofac がオブジェクトを破棄しないことについて、以前ここで質問しました。私は今、より大きな問題を抱えていると思います.なぜなら、それが同じオブジェクトのリクエストツーリクエストを提供しているという証拠があるからです. 繰り返しますが、私はこちらの指示を使用しています。デリゲート構文を使用してオブジェクトを作成しているため、私のテストはもう少し複雑ですが、リクエストの有効期間にフラグを立てていると思います。Global.asax.cs:
ここでの私の意図は、IDBConnectionSelector を登録して、カスタム コンストラクターで作成された具象型の CachingDBConnections を取得することですが、HTTP 要求スコープを使用することです。
CachingDBConnections オブジェクトのいくつかのメソッドが後続のリクエストで失敗するため、リクエストごとに新しいものではなく、前回取得したものと同じものを取得していると思われます。
それは理にかなっていますか?私は何を間違っていますか?
asp.net - Autofac、ASP.NET、および Microsoft.Practices.ServiceLocation
私は、Web アプリに IoC を実装するための詳細を調べてきましたが、Microsoft.Practices.ServiceLocation を活用する方法で行いました。私は特に Autofac と asp.net の統合を使用していますが、他のコンテナーに対して自分自身を開いたままにしたかったのです。この質問の行に沿って、Web アプリ コードでコンテナーにアクセスする方法が心配でした。
主に解決するインターフェイスを定義する「コア」ライブラリがあります。このコア ライブラリは、私の Web アプリや他のアプリでも使用されています。共通のインターフェースを定義すると非常に便利です。これは、IoC コンテナーへのアクセスを配置するのに最適な場所だと思い、静的クラスを使用して実行しました。トリックは、コンテナを静的クラスに注入することです。
Web 環境ではコンテナがリクエストごとに異なる可能性があるため注意が必要ですが、Web 以外のアプリでは常に同じになる可能性があります。最初はコンテナにメソッドを直接注入しようとしましたが、次の Web リクエストですぐに失敗しました。だから私はこれを思いついた:
今私のglobal.asax.csでこれを行います:
そして、依存関係を解決するための呼び出しは次のようになります
したがって、特定のコンテナーを渡すのではなく、コンテナーを取得する方法を知っているデリゲートを渡します。非 Web アプリケーションの場合、デリゲートはおそらく build() が提供するものを返すだけです。
専門家への私の質問は、これは理にかなっていますか? コンテナー製品が何であるか、またはコンテナー自体がどこから来たのかを知らなくても、依存関係を解決できるものにたどり着く簡単な方法があります。どう思いますか?