問題タブ [dryioc]
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.
dryioc - フォールバック コンテナー/リゾルバーの DryIoc の作成
現在、DryIoc を試すために Prism.DryIoc.Forms プロジェクトの作成に取り組んでいます (初めて!)。
Xamarin.Forms にはネイティブの DependencyService があり、Prism の使用に移行するための優れた方法を提供するために、要求されたサービス タイプをメイン コンテナーから解決できない場合に備えて、フォールバック コンテナーとして追加したいと考えています。
現在、私は を作成しFallbackContainer
、のインスタンスを渡し、IContainer
メソッドをオーバーライドし、作成中に渡されたインスタンスへIResolver
の残りのIContainer
呼び出しを委任します。
したがって、デフォルトのコンテナが作成および構成された後、次のことを行います
これは好ましい方法ですか、それともデフォルトを添付するだけの方法はありますIResolver
か?
現在の実装
ありがとう、DryIoc をテストするのを楽しみにしています
c# - DryIoc - 基本クラスがキー名で登録されている場合の派生クラスの解決
Prism.Forms ( https://github.com/joacar/Prism/tree/pr-517 ) で DryIoc のサポートを構築しようとすると、どうすればよいか分からないシナリオに出くわしました。
簡単に言うと、問題は次のようになります。Prism.DryIoc.Forms で新しいアプリケーションを作成するとき、PrismApplicationBase のアプリケーション サブクラスを作成し、特定のメソッドをオーバーライドします。そのうちの 1 つは RegisterTypes です。
呼び出されると、ユーザーはナビゲーション用のビューを登録できます
ナビゲーション中にクラスDryIocPageNavigationService
が関与し、オーバーライドするメソッドが 1 つあります。protected Page CreatePage(string name) { ... }
ここで問題が発生します。現時点では、Page
IContainer を使用して特定の「名前」の実装を解決する方法しかわかっていません。
ただし、そのような方法で拡張メソッドを実装すると、
ページが解決されます。TPage
ただし、これにより、デフォルトの空のコンストラクターが制限されます (または、巧妙な/望ましくないハッキングを行います)。
うーん、短編小説はかなり長くなります:)
よろしくお願いします
c# - DryIoc.WebApi のセットアップ
.NET WebAPI アプリケーションでの DryIoc の使用を調査していて、初期化手順で奇妙な動作に気付きました。簡単なテスト webapi アプリケーションでは、WebApi 構成登録の直後に呼び出される次の DryIoc 登録クラスがあります。
そして、次の WebApi コントローラー:
これはうまくいくように見えますが、試してみると同じように見えますが、もう少し冗長に書かれたコードではエラーが発生します。
私が得る例外は次のとおりです(JSONとして):
これは、DryIoc の何かおかしなことですか、それとも、これまで出会ったことのない C# のニュアンスですか?
c# - プロパティ注入のためのDryIOCコンテナ構成
コンストラクター引数を注入するのと同じ方法で依存関係をプロパティとして単純に注入するように DryIoc コンテナーを構成する方法の簡単な例を広く検索しました。
次の作業例を考えると...
コンテナ登録:
ウィジェット サービス:
ウィジェット リポジトリ:
DryIoc が WidgetRepository をプロパティとして挿入する場合、このような WidgetService をサポートするには、構成をどのように変更する必要がありますか?
希望するウィジェット サービス:
失敗した試み
これらの設定変更を試してみましたが、WidgetService でプロパティ インジェクションを有効にしても効果がないようです。
試行 1:
試行 2:
私も上記をPropertiesAndFields.All
で試しましたが、運もありませんでした。
注: プロパティ インジェクションは推奨されるアプローチではなく、多くの理由でコンストラクタ インジェクションが推奨されることを理解しています。ただし、両方を正しく行う方法を知りたいです。
アップデート
@dadhi のアドバイスに従って、試み #2 を次のようにコンテナを初期化するように変更しました。
しかし、私はこのエラーを受け取りました:
DryIoc は、私が持っていなかった引数なしのコンストラクターを使用して、WidgetController を初期化しようとしているようです。ルールが に変更されて以来 PropertiesAndFields.All(...)
、DryIoc はすべての登録済みアイテムに対してプロパティ インジェクションを使用しようとしていると思います。
プロパティ注入を使用して WidgetService (上記) を初期化しようとしましたが、コンストラクター注入を使用して WidgetController を初期化しようとしました。PropertiesAndFields.Auto
両方はできないかもしれませんが、ルール上は両方できると思っていました。WidgetController もプロパティ インジェクション用に設定するように変更しました。その後、DryIoc から例外は発生しませんが、WidgetController で WidgetService が null になります。これが更新された WidgetController です。
自動プロパティ インジェクションはまだ難しいようです。
更新 2
多くの試行錯誤 (および @dadhi からの提案) の後、WidgetController でコンストラクター注入を使用し、他のサービスを登録するときにプロパティ注入を指定することにしました。これにより、コントローラーを除いて、現在プロパティ注入を利用しているコードをコンストラクター注入に移行することができます。更新されたコンテナ登録は次のとおりです。
コントローラーと他のサービスの両方で機能するゴールデン設定を最終的に見つけたいと思っていますが、動作が異なるようです。しかし、これは今のところ十分に実行可能な解決策です。
アップデート 3
プロパティ注入としてすべて (WidgetController を含む) を配線する別の試みで、@dadhi の提案に従ってコンテナー構成を次のように更新しました。
これは少なくとも、ある程度意味のある例外を生成するようであり、使用するコンテナーをセットアップするときにコントローラーが異なる方法で処理される理由を説明する可能性がありますPropertiesAndFields.All(..)
。
c# - DryIoc with Serilog - ロギング コンテキストの設定
現在 Autofac を使用しており、AutofacSerilogIntegration を活用して、ILogger がコンクリートに注入されたときにログ コンテキストを自動的に設定しています。統合は、ロガーが挿入されるタイプでロギング コンテキストを設定します。これは Autofac では不当に難しいことではありません。これは、任意の解決に使用できる「準備中」イベントがあるためです...そのため、ILogger の解決を傍受し、その時点で ILogger を強化することができ、Autofac は含まれている型をこのインターセプターから確認できます。コードは次のとおりです: https://github.com/nblumhardt/autofac-serilog-integration/blob/master/src/AutofacSerilogIntegration/ContextualLoggingModule.cs
私は、DryIoc でインターセプトが利用できることを見てきましたが、Autofac アプローチほど単純なものはありません。DryIoc では、インターセプトされるタイプで注入されたコンクリートごとにインターセプターを登録する必要があるようです。 https://bitbucket.org/dadhi/dryioc/wiki/Decorators#markdown-header-decorator-as-interceptor-with-castle-dynamicproxy
DryIoc でこの問題にアプローチするための最善の方法について誰かアドバイスはありますか? これは、比較的一般的でパフォーマンスの高い方法で可能ですか? DryIoc のドキュメントを見た後、注入されるクラスがある種の一般化されたインターセプター (およびグローバルに適用できる) で決定できる場所が表示されないため、これに対する直接的なアプローチはわかりません。 . これは非常に遅いことが知られているため、ロガーからのコールスタックを調べたくありません。
ありがとう
dryioc - DryIoc cannot resolve my boolean instance?
I try to register a class which constructor requires a few string, a ILog and a bool. All in my container is registered as a singleton (set as the default Reuse).
But whenever I try to get an instance of that class container.Resolve<AzmanAccess>()
, an exception gets thrown.
Unable to resolve Boolean as parameter "accessAll" in Company.Common.Util.Authentication.AzmanAccess: Company.Common.Util.Authentication.IAzmanAccess {RequiredServiceType=Company.Common.Util.Authentication.AzmanAccess} as parameter "azmanAccess" in Company.Common.Util.Authentication.AzmanCustomAccess: Company.Common.Util.Authentication.IAccess as parameter "access" in Company.Common.Util.Authentication.User: Company.Common.Util.Authentication.IUser Where CurrentScope: null and ResolutionScope: null and Found registrations: skipAuthz,{ID=53, ImplType=Boolean, Reuse=SingletonReuse {Lifespan=1000}}} System.Object,{ID=25, ImplType=Boolean, Reuse=SingletonReuse {Lifespan=1000}}}
I register my class like this:
and the constructor is:
Where servicekeys (AccessAll, ...) are unique (tried with objects, then string).
What's going wrong?
dryioc - 依存関係を解決するときに特定の実装をオーバーライドする
私はドキュメントを読みましたが、型の解決について何も見つけることができず、同時にその依存関係のいくつかをオーバーライドします。例で説明するのが最も簡単
それは理にかなっていますか?のようなものを探していました
DryIoc との素晴らしい仕事
編集 (2016-05-26) 私の質問は誤解を招くものでした。以下は完全なコード例です(プリズムの場合)