問題タブ [constructor-injection]

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.

0 投票する
3 に答える
3321 参照

dependency-injection - [ImportingConstructor]を使用して、MEFを使用して呼び出し元オブジェクトをコンストラクターパラメーターにインポートします

私は自分のコードの一部を、MEFと同じようなことをするプロプライエタリシステムからMEFに変換している最中です。最近遭遇した次の問題をどのように達成するかについて、質問があります。

次のような典型的なエンティティオブジェクトがあります。

そして、上記のエンティティオブジェクトにインポートする必要があるサービスオブジェクト:

これを言葉で表現するには、コンストラクターインスタンスにaccount渡されるパラメーターが呼び出し元オブジェクトのオブジェクトである必要があります。このように動作するように:AccountServerServiceAccount

このシナリオが可能かどうか、またはこの場合にサービスインターフェイスをリファクタリングする必要があるかどうかをお知らせください。

0 投票する
2 に答える
10526 参照

dependency-injection - GlassFish、CDI、およびコンストラクターの注入

管理対象 Bean の CDI の GlassFish 3.1 実装では、コンストラクター注入はサポートされていますか? @Singletonコンストラクター注入を使用して別のマネージド Bean (同じ EJB モジュールに含まれる) を注入したい EJB があります。フィールドインジェクションは機能します。しかし、コンストラクター注入を使用すると、NullPointerExceptionfrom AbstractSingletonContainer.

これは機能します:

これは動作しません:

0 投票する
1 に答える
887 参照

c# - Unityアプリケーションブロック-構成ファイルへのコンストラクターインジェクション

オブジェクトの作成中に、パラメーターのないコンストラクターを使用するように指定するにはどうすればよいですか?パラメータ化されたものに対してそれを行う方法を知っていますが、パラメータレスコンストラクタのヘルプを見つけることができません。

私はコードを介してこれを行う方法を知っていますが、構成を介してこれを行うためのソリューションが必要です。

0 投票する
1 に答える
540 参照

asp.net-mvc-2 - Ninject 2.0: 実装に応じて異なるパラメーターを渡す

ASP.NET MVC 2 で Ninject 2.0 を使い始めたばかりです。そのため、インターフェイス IMongoRepository とクラス MongoRepository があります。

MongoRepository は、パラメーター文字列のコレクションを受け取ります。

使用するコレクションに応じて、MongoRepository のパラメーターに異なる値を渡します。これが正しい言い回しであることを願っていますが、使用しているコントローラーに応じて異なるパラメーターをどのようにマッピングすればよいでしょうか?

たとえば、Article コントローラーでは、次のように呼び出します。

そして PageController では、次のように呼び出します。

私がやりたいことは、コンストラクター注入を行い、IMongoRepository を渡すことです。アイデアや提案はありますか?

ところで、私はちょうど IOC/DI について学んでいます。ですから、IOC 忍者からのヒントをお待ちしています。ありがとう!

0 投票する
1 に答える
1670 参照

assemblies - 外部アセンブリの型のコンストラクタインジェクションでNinjectを使用する方法

外部アセンブリから型をロードしていて、その型のインスタンスを作成したいと思います。ただし、このタイプ/クラスは、現在管理/バインドされているオブジェクトによるコンストラクタインジェクション用に設定されていNinjectます。Ninjectこのタイプのインスタンスを作成し、コンストラクターの依存関係を挿入するにはどうすればよいですか?

以下は私がこのタイプを取得する方法です。

0 投票する
1 に答える
219 参照

dependency-injection - DI、コンストラクター インジェクション、モジュール、デザイン パターン

私が関与しているプロジェクトでいくつかのアーキテクチャ上の問題に直面しています。プロジェクトは、DI、特に Unity によるコンストラクター注入に依存する ASP.NET MVC 2 アプリケーションです。アプリケーションは、サービスを他のモジュールに公開するいくつかのモジュール (各モジュールはアセンブリのセット) に分割されます。これらのサービスは、アプリケーションの起動時に Unity に登録されます。今まで特別なことは何もありません。私がこれを持っているとしましょう(各モジュールは単純化のためのアセンブリです):

モジュールA、モジュールB。

ModuleA は、次のメソッドを使用してサービス 'IServiceA' を公開します。

IServiceA (操作 1 - 操作 2 - 操作 3)

ModuleB の ServiceB は ModuleA の IServiceA を必要とし、コンストラクター インジェクション (具体的な実装を使用) によって取得します。次に、それを使用します。

問題は、ModuleA が非アクティブ化されている場合 (アプリケーションの起動時に現在のユーザーに対してモジュールがアクティブ化されているかどうかをデータベースで確認します)、serviceA が Unity に登録されていないことです。

Unity が IServiceA の登録を見つけることができず、ServiceB を構築できないため、実行時に例外が発生します。これは正常です。

それに対処するための一連のパターンまたはベストプラクティスがあることを知りたいです。私の最初のことは、ServiceB のコンストラクター注入を取り除くことでした。しかし、その後、ServiceA へのハード リファレンスを使用する必要がありますが、それが気に入らないか、さらに悪い ServiceLocator を使用する必要があります。ServiceA が利用可能かどうかにかかわらず、ModuleB をチェックインしたくありません。他にも多くのサービスがあり、純粋なインフラストラクチャ コードを処理する必要があるためです。serviceA が利用可能かどうか (可能かどうかわからない) の場合、ServiceB が同じコードを実行することを希望します。Gateway パターンを見ましたが、これが役立つかどうかわかりません。

どんな助けでも大歓迎です。

ありがとう、

0 投票する
1 に答える
1933 参照

ninject - Ninject、Providers、およびActivator.CreateInstance

私はNinjectにかなり慣れていませんが、カスタムプロバイダーを使用してDIに使用することに成功しました。

バインディングは次のように初期化されます

カスタムプロバイダーでは、Activator.CreateInstanceを次のように呼び出します

(はい、上記のコードにはエラー処理などがないことを認識しています:))

そして、これはすべて魅力のように機能します。

今、私が直面している問題は、IPatientRecordLocatorのインスタンスに注入したい新しいクラスを導入するときです。これらのクラスの1つに次のようなコンストラクターを追加すると、問題が発生します

次に、Activator.CreateInstanceを機能させるには、パラメーターのないコンストラクターをクラスMockPatientRecordLocatorに追加する必要があります。

だから、私の質問は、NinjectにIContactAdapterを実装するクラスのインスタンスをMockPatientRecordLocatorなどに注入させるにはどうすればよいですか?メソッドインジェクションを試しましたが、役に立ちませんでした。

私が達成しようとしているのは、クラスPatientRecordSummaryのインスタンスにMockPatientRecordLocatorのインスタンスが注入され(コンストラクター注入を使用)、MockPatientRecordLocatorのインスタンスにIContactAdapterのインスタンスが注入されるという一種の連鎖注入であることを説明するのを忘れました(再びコンストラクタインジェクションを使用します(可能な場合))。チェーンの最初の部分は機能しますが、2番目の部分は機能しません。

0 投票する
1 に答える
818 参照

dependency-injection - Unity を使用して保護されたコンストラクターにパラメーターを挿入することは可能ですか?

ウィンザー城でこれを行うことができます:

これはUnityで可能ですか?私はそれをやろうとしましたが、コンストラクターが見つからないと不平を言います。サブタイプ経由でしか注入できないようです。

0 投票する
1 に答える
2627 参照

dependency-injection - コンストラクター インジェクションとサービス ロケーターを使用するタイミング

StructureMap の使用方法の一部を理解するのに苦労しています。特に、ドキュメンテーションでは、一般的なアンチパターン、コンストラクター注入の代わりにサービスロケーターとしてのみ StructureMap を使用することに関するステートメントが作成されています (Structuremap ドキュメントから直接のコードサンプル)。

それ以外の:

これは非常に短いオブジェクト グラフでは問題ありませんが、オブジェクトを何レベルも深く処理する場合、これは、より深いオブジェクトに必要なすべての依存関係を上から直接渡す必要があることを意味しますか? 確かに、これはカプセル化を破り、より深いオブジェクトの実装に関する多くの情報を公開します。

たとえば、Active Record パターンを使用しているとします。そのため、レコード自体を保存およびロードできるようにするには、データ リポジトリにアクセスする必要があります。このレコードがオブジェクト内に読み込まれる場合、そのオブジェクトは ObjectFactory.CreateInstance() を呼び出して、アクティブなレコードのコンストラクターに渡しますか? そのオブジェクトが別のオブジェクトの中にある場合はどうなりますか。さらに上から IRepository を独自のパラメーターとして取り込みますか? これにより、この時点でデータ リポジトリにアクセスしているという事実が親オブジェクトに公開されますが、これはおそらく外部オブジェクトが認識すべきではないことです。

任意の考えをいただければ幸いです。

サイモン

編集: インジェクションは最上層から開始する必要があるという意見があるようです。ActiveRecord は OuterClass に注入される ThingThatNeedsRecord に注入されます。これに関する問題は、実行時パラメーター (たとえば、取得するレコードの ID) を使用して ActiveRecord をインスタンス化する必要がある場合です。ActiveRecord を ThingThatNeedsRecord の一番上に挿入している場合、その時点で必要な id をどうにかして把握する必要があります (これにより、最上位レイヤーが実装されるべきではありません)、または部分的に構築された ActiveRecord が必要になります。後でIDを設定します。N 個のレコードが必要で、ThingThatNeedsRecord 内のロジックを実行するまでわからない場合、これはさらに複雑になります。

0 投票する
2 に答える
3138 参照

autofac - Autofacを使用して同じオブジェクトの2つのインスタンスを注入する方法は?

Autofac コンストラクター インジェクションを使用しています。コンテナーのセットアップ フェーズで各引数を明示的に解決する必要なく、単一のオブジェクト インスタンスを複数のコンストラクター引数に挿入する方法を理解する必要があります。

この動作によって単純化される複雑なシナリオがあります。次の例は単純化されたシナリオであるため、探している動作を示すことができます。

例:

IOpenable と ICloseable の 2 つのインターフェイスがあるとします。

そして、私はそれらの両方を実装するこの Door クラスを持っています:

そして、IOpenable と ICloseable を受け入れるこのクラスがあります。

質問:

IOpenable と ICloseable の両方が同じコンストラクターで依存関係にある場合は常に、同じDoor オブジェクトを両方の引数 に挿入するように autofac に指示することは可能ですか?

注:私はできません

それ私が望んでいることですが、この DoorHandler クラスは単なる例であることを覚えておいてください。私の実際のコードでは、「DoorHandler」は実際には MVC コントローラーであり、RegisterControllers() で登録しています。なので、上記のように登録することはできません。さらに、ディペンデンシー グラフが過度に複雑になる場合があり、すべてのケースでこれを明示的に行うと圧倒されることがあります。

私が探しているのは、次のようなことができることだと思います。

c.ResolveShared<T>同じコンストラクターで複数の引数に対して呼び出された場合、への呼び出しはすべて同じ T オブジェクトに解決されます。

多分:

ドア オブジェクトに InstancePerLifetimeScope などを使用していた場合、解決された各ドアは同じインスタンスになります。しかし、私はそれを望んでいません。DoorHandler が作成されるたびに Door の新しいインスタンスが必要であり、その Door が両方の引数として DoorHandler コンストラクターに渡されるようにしたいと考えています。