問題タブ [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.
asp.net-mvc - CastleWindsorのコンポーネントを自動的に遅延解決
コンテナにLazyOfTComponentLoaderを登録し、ここでLazy<T>
指定されているように解決することで、CastleWindsorのコンポーネントを遅延解決することができます。
ただし、resolve呼び出しでLazyを指定しなくても、コンポーネントが常になしとして解決されるように、コンポーネントをコンテナーに登録することは可能ですか?Lazy<T>
具体的には、コンストラクターインジェクションを使用するときに、MVCプロジェクトのコントローラーにレイジーコンポーネントをインジェクトする方法を考えています。
編集:ここLazy<ISomeService> someService
に表示されているように、コントローラーのコンストラクターでパラメーターとして指定できます。ただし、登録プロセスを通じてコンポーネントが遅延して解決されるようにする方法はありますか?
java - Spring フレームワークでの Java 構成
クラスA
とB
その実装AImpl
がありBImpl
ます。
Guice で依存関係を構成するには、smt のように記述します
春にはsmtのようにできる
いくつかの欠点があります
- AImpl には 2 つの場所 (コンストラクターと構成) で B が必要であると書く必要があります。
- もっとコードを書く必要があります (CImp と AImpl は、1 つの式ではなくメソッドの作成が必要です)
xml を実行せずに私の春の構成を改良する方法はありますか?
upd @Component のようなスプリング関連のアノテーションでクラスを汚染したくありません。そして、他のあらゆる種類の注入よりもコンストラクター注入を好みます。スキャンも好ましい解決策ではありません。では、Guice の方法で Spring を実行できますか?
upd2
だからアーカイブが欲しい
- 自動配線
- コンストラクター注入
それなし
- XML
- パススキャン
default - インターセプターを持つ CDI Bean にはデフォルトのコンストラクターが必要ですか?
CDI Bean があり、この Bean の 1 つのメソッドにインターセプターが追加されています。この Bean にデフォルトのコンストラクターがない場合 (コンストラクター インジェクションを使用します)。実行時に例外が発生します
この Bean にデフォルトのコンストラクターを追加するか、インターセプターを削除すると、問題ありません。実際、フィールド注入を使用してこの問題を処理できます。
しかし、知りたいのは、デフォルトのコンストラクターを追加すると、この Bean には 2 つのコンストラクターがあることを意味し@Inject
ます。この場合 (インターセプターを使用)、コンテナーはインスタンスを 2 回作成しますか?
編集: Tomee1.5 を使用しています。WebShpere8.5 は Tomee1.5 と同じで、GlassFish3.1.2 にはこの問題はないようです。
編集: Tomee User Forum で、CDI コンテナーは、Bean の @Inject 注釈付き ct を呼び出しますが、プロキシの作成にはデフォルトの ct を使用するという回答を見つけました。したがって、コンストラクターインジェクションを使用する場合は、プロキシ可能にするためのデフォルトのコンストラクターも必要であることを意味すると思います。
編集:
http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443によると 、Bean がデフォルトのスコープ @Dependent を持たない限り、コンテナーは注入されたすべての参照を Bean に間接的に転送する必要があります。プロキシ オブジェクト。
//openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html によると、CDI コンテナーは Bean の @Inject アノテーション付きコンストラクターを呼び出しますが、プロキシの作成にはデフォルトのコンストラクターを使用します。したがって、すべての 'NormalScoped' (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped) Bean には常にプロキシされるため、デフォルトのコンストラクターが必要です。
Bean がインターセプターを使用する場合、エラー メッセージによると、OpenWebBean は Proxy を使用してインターセプターを処理するため、インターセプトされたクラスにはデフォルトの構成が必要です。ただし、Weld はインターセプターとデコレーターにサブクラスを使用します。https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel サブクラス化ソリューションはプロキシ化よりも優れています。多くの問題を処理する必要がないためです。例: 引数のないコンストラクターのないインターセプトされたクラスと、プロキシ化されたインスタンスでのフィールド アクセス。したがって、Tomee と Websphere を使用する場合、デフォルトの ct が必要ですが、GlassFish には必要ありません。
brandizzi に感謝します。ここでの最初の質問です。ご協力ありがとうございました。そして、私は自分の質問に答えることができず、評判が10でないと2つ以上のリンクを投稿できないようですので、ここで編集しました.
c# - 単体テスト コンストラクター インジェクション
私のFoo
クラスには次のものがあるとします。
ArgumentNullException
これまでのところ、null を渡してがスローされることを確認するコンストラクターの単体テストが 1 つあります。IService
有効な値を渡し、それが設定されていることを確認するコンストラクターの 2 番目の単体テストthis.service
が必要ですか (パブリック アクセサーが必要になります)。
それとも、Start
このコード パスをテストするメソッドの単体テストに頼るべきでしょうか?
c# - NinjectはConstructorArgumentとして匿名デリゲート(func)を使用できますか?
ほとんどすべての CRUD 機能をカプセル化するリポジトリ抽象クラスがあります。
プロパティは派生クラスでこのKeyCompare
ように使用されるため、基本クラスはリポジトリ内の単一のアイテムを分離する方法を認識します (すべての「エンティティ」に「Id」プロパティがあるわけではなく、一部のキーは複数の列にまたがります - このソリューションはその特定の点を解決します):
このKeyCompare
プロパティは、派生クラスが次のように単にUpdateExisting
メソッドを実装できるようにする基礎です。
残り (実際の CRUD) はすべて基本クラスによって処理されます。この抽象的なリポジトリを使用して、具体的なものを数秒ではないにしても数分で実装し、各実装に固有のコードのみを記述しました。とても乾いているので、のどが渇いています。
はDataRepository<T>
SQL Server を扱っているため、モック用にさらに別の実装が必要でした。これを呼び出してListRepository<T>
、ほとんど同じことを行います (ただしContext
、 とTransaction
プロパティの両方が を返しますnull
)。ここに投稿する必要があるのは、コンストラクターの署名だけだと思います。
これで、テストの準備が整いました。Ninject を IoC コンテナーとして使用したいと考えています。私の問題は、匿名デリゲートを次のように渡す方法がわからないことですConstructorArgument
。
私がやろうとしていることは実行可能ですか、それとも複雑すぎますか? それが良い/きれいなコードかどうかを尋ねるつもりはありませんが、ここで建設的なコメントを歓迎します:
c# - コンストラクターで依存関係と値を組み合わせる
依存関係といくつかの文字列値の両方を初期化する必要があるクラスを持つという問題によく直面します。たとえば、次のコードを考えてみましょう。
問題は、文字列パラメーターが追加されているため、DI コンテナーからそれを簡単に取得できないことです。この問題を解決する最善の方法は何ですか? これらは私が考えることができる方法です:
- Initialize メソッド (Mark Seeman の定義による一時的な結合を提供するため、十分ではありません。あまり良い方法ではないことに同意します)
- 抽象ファクトリ (パラメーターは構成であり、構成を行うときにそれを知っているため、間接的なレイヤーを 1 つ追加する必要はありません)
- 例のように使用し、クラスのインスタンスをDIコンテナに登録します
java - 同じ Bean 構成が Application Server で失敗せずに実行されている間に JUnit テストを実行した後の Bean 作成例外
Web アプリケーション コンテキストと Junit テスト ケースに同様の Spring Bean 定義を使用しています。テストケースの実行中にorg.springframework.beans.factory.BeanCreationExceptionをスローしていますが、正常に実行されている Web アプリケーションコンテキストで同じ Bean 構成が使用されています。失敗している Bean 定義は次のとおりです。
クラスJackRabbitManagerImplのコンストラクターのシグネチャは次のとおりです。
これは、2 つの引数を持つ唯一のコンストラクターです。
テストケースの実行中に、Bean jackRabbitManagerの依存関係が正常に作成されています。jackRabbitManagerの作成中にorg.springframework.beans.factory.BeanCreationExceptionをスローします。例外のスタック トレースは次のとおりです。
コンストラクターの引数に型を指定することで、コンストラクター注入のあいまいさを取り除こうとしました。しかし、それでも私は同じ問題を抱えています。
同じ Bean 定義が Web アプリケーション コンテキストで正常に実行されています。この問題を克服するのを手伝ってください。
java - 春要素は参照または値を指定する必要があります
Spring とコンストラクター インジェクションに問題があります。String
名前 ( ) と特別な ID ( )を持つオブジェクトを動的に作成したいと考えていますlong
。
しかし、spring.xml ファイルが読み込まれると、例外が発生します。
スレッド「メイン」での例外 java.lang.ExceptionInInitializerError
原因: org.springframework.beans.factory.UnsatisfiedDependencyException: クラスパスリソースで定義された名前 'someBean' を持つ Bean の作成エラー [spring.xml]: タイプ [long] のインデックス 0 のコンストラクター引数によって表現された満たされていない依存関係: あいまいなコンストラクター引数タイプ - 正しい Bean 参照をコンストラクター引数として指定しましたか?
私のspring.xml:
では、何が問題なのですか?コンストラクター引数のインデックスは 1 です (例外として 0 ではありません)。
c# - 依存性注入、同じタイプのインターフェースの辞書を必要とするクラスは良い考えですか?
Code Reviewでこの質問をしましたが、元のコードは現在忍び寄っています。はい、私は Clean code talk の大ファンでもあり、これらの素晴らしいビデオを見ました。この別の質問も見ました。これは、私が最初に抱えていた問題と同じです。
私は人間と言うクラスを持っています。人間は、その Travel メソッドでの決定に基づいて、Horse、Camel、または Ship To Travel を呼び出すか、(状況によっては) それらすべてに Travel を依頼することもできます。
Horse、Camel、Ship のすべてに ITransport インターフェイスがあり、もちろんこのインターフェイスには Travel メソッドがあります。
最初の問題は、私のプロジェクトの存続期間中に、飛行機、ロケット、潜水艦などの新しい輸送手段を手に入れる可能性があることです.
したがって、コンストラクターのパラメーターが膨張し続けるため、単純に ITransport 船、ITransport horse ..... などとしてコンストラクターに渡すことはできません。
そのため、HumanFactory にはイベントが必要であり、そのイベントは Human クラスのコンストラクターに渡される必要があるという提案 (と思います) の解決策に至りました。
私はどういうわけか私の巨大なトランスポート リストを削除しましたが、ご存知のように、インターフェイスには多くのメソッドを含めることができます。そのため、それぞれがインターフェイスのメソッドに対応し、もちろん必要に応じて、多数のデリゲートを渡す必要があります。
私は、正しいトランスポートにマップし、正しいイベントを呼び出すことだけを担当する Human Mapper クラスを作成することで、この問題を解決しようとさえしました。これはうまくいきます!
さて、これは架空の例であるため、実際の例ではインターフェイスのメソッドがパラメーターを受け入れるので、どのように対処すればよいでしょうか?
私が目指す方向はメンテナンスナイトメアを作ることだと思います。
クイックリファレンス用にコードを貼り付けています。
私のトランスポートファクトリーは次のとおりです。
提案後の私のヒューマンクラスは次のようになりました。
提案されているように、次のようなヒューマンクラスファクトリがあります。
私は、正しいトランスポートを正しいメソッドにマップする Mapper クラスについて話しました (見苦しく見えますが、それが私が思いついた最高のものでした:) ):
このイベントで、Travel メソッドの引数が 2 つある場合、デリゲート シグネチャが変更されることを確認してください。
ここで私の問題を説明できたことを願っています。ありがとう
編集:読みやすくするために、この質問からいくつかの明白なコードを削除しています。また、より冗長になっています。
c# - タイプのグローバルバインディングをオーバーライドしないNinject WithConstructorArgument?
私は一般的なバインディングを持っていますが、そのうちの 1 つがこれです。
このハッシャーを使用するクラスがいくつかあるため、これはうまく機能します。ただし、md5 ハッシュを期待する gravatar など、サードパーティでハッシュを使用するために別のタイプのハッシャーを必要とする 1 つまたは 2 つのコントローラーがあります。だから私は以下を行います:
次に、コントローラーは次のようになります。
デバッグするときは、IHasher が Md5Hasher であると予想しますが、これは Sha256Hasher です。これは予想される動作であり、オーバーライドされた型を使用する方法はありますか?