タグ付けされた質問 「dependency-injection」

Dependency Injectionは、コンポーネントの依存関係(オブジェクトのインスタンス、プロパティ)がコンストラクタ、メソッド、またはフィールド(プロパティ)を介して設定される設計パターンです。これは、より一般的な依存関係の反転の特殊な形式です。

4
なぜ依存性注入のためのフレームワークが必要なのですか?[閉まっている]
Inversion of Controlの原則とDependency Injectionをその実装としてさらに読んでいますが、それを理解していると確信しています。 基本的に「クラス内でクラスメンバーのインスタンス化を宣言しない」と言っているようです。むしろ、インスタンス化はコンストラクターに渡され、コンストラクターを通じて割り当てられる必要があります。外部ソースからクラスに「注入」されました。 それがそうであるように思えるこの単純な場合、注釈を使用してこれを実装するspringやguiceのようなフレームワークが必要なのはなぜですか?ここに基本的なものがありませんか?Dependency Injectionフレームワークの使用方法を理解するのに本当に苦労しています。 編集:可能性のある重複について、私の質問はSpringだけでなく一般的なDIフレームワークについて尋ねているため、よりユニークだと思います。Springは単なるDIフレームワークではないため、DIに関係のないSpringを使用したい理由はたくさんあります。

2
依存性注入はいくらですか?
私は、クラスの依存関係である文字通りすべてに(Spring)Dependency Injectionを使用するプロジェクトで働いています。Spring構成ファイルが約4000行に拡大した時点です。少し前、ボブおじさんの講演の1つをYouTubeで見ました(残念ながら、リンクが見つかりませんでした)。配布されます。 このアプローチの利点は、DIフレームワークをアプリケーションの大部分から切り離すことです。また、工場には以前の構成に含まれていたものがより多く含まれるため、Spring構成がよりクリーンになります。それどころか、これにより、多くのファクトリクラス間で作成ロジックが広がり、テストがより難しくなる可能性があります。 ですから、私の質問は、あなたが他のアプローチで見ている他の長所と短所です。ベストプラクティスはありますか?ご回答ありがとうございます!

12
コードの作成方法の段階的なシフトは、システムのパフォーマンスに影響しましたか?そして、私は気にする必要がありますか?
TD; DR: 私が尋ねていたものに関していくつかの混乱があったので、ここに質問の背後にある運転のアイデアがあります: 私はいつもそれが何であるかという質問を意図していました。当初はうまく表現できなかったかもしれません。しかし、意図は常に「モジュール式、分離、疎結合、分離、リファクタリングされたコード」であり、「モノリシックな単一ユニット、1か所ですべてを行う、1つのファイル、密結合された」コードよりも、それ自体の性質が著しく遅い。残りは単なる詳細であり、その際に私が出会った、または現在または将来出会うであろうさまざまな症状です。ある程度の規模では確かに遅いです。最適化されていないディスクのように、どこからでも断片を拾わなければなりません。遅いです。確かに。しかし、私は気にする必要がありますか? そして問題は…ではない マイクロ最適化、時期尚早な最適化などに関するものではありません。「これまたはその部分を最適化して死ぬ」ことではありません。 それは何ですか? それは、時間の経過とともに現れたコードの記述についての全体的な方法論と手法、および考え方に関するものです。 「このコードを依存関係としてクラスに挿入する」 「クラスごとに1つのファイルを書き込む」 「データベース、コントローラー、ドメインからビューを分離する」。 スパゲッティの均質な単一のコードブロックを書くのではなく、一緒に動作する多くの個別のモジュールコンポーネントを書く 現在-この10年以内に-ほとんどのフレームワークで見られ、主張され、規約で主張され、コミュニティを介して伝えられているコードの方法とスタイルについてです。「モノリシックブロック」から「マイクロサービス」への考え方の転換です。それに伴い、マシンレベルのパフォーマンスとオーバーヘッド、さらにプログラマレベルのオーバーヘッドの面で価格が発生します。 元の質問は次のとおりです。 コンピュータサイエンスの分野では、プログラミングに関しては思考の著しい変化に気付きました。私はこのようなアドバイスを頻繁に目にします。 より小さな関数ごとのコードを記述します(この方法によりテストと保守が容易になります) ほとんどのメソッド/関数の長さが数行になり、目的が明確になるまで、既存のコードをますます小さなコードチャンクにリファクタリングします(より大きなモノリシックブロックと比較して、より多くの関数を作成します) 1つのことだけを行う関数を書く-関心の分離など(通常、スタック上により多くの関数とフレームを作成します) より多くのファイルを作成します(ファイルごとに1つのクラス、MVC、ドメインアーキテクチャ、デザインパターン、オブジェクト指向などのレイヤーの目的のために、より多くのファイルシステム呼び出しを作成するために、分解の目的でより多くのクラス) これは、2500行にまたがるメソッドと、すべてを行う大きなクラスと神オブジェクトを持つ「古い」または「時代遅れの」または「スパゲッティ」コーディングプラクティスと比較した変更です。 私の質問はこれです: 呼び出しがマシンコード、1と0、アセンブリ命令、HDDプラッターに至るとき、リファクタリングされたさまざまな小から小の関数とメソッドを備えた完全にクラス分離されたOOコードも生成されることを心配する必要がありますか余分なオーバーヘッドですか? 詳細 OOコードとそのメソッド呼び出しが最終的にASMでどのように処理されるか、またDB呼び出しとコンパイラー呼び出しがHDDプラッター上のアクチュエータアームの移動にどのように変換されるかについてはよく知りませんが、いくつかの考えがあります。追加の関数呼び出し、オブジェクト呼び出し、または(#include)呼び出し(一部の言語)は、追加の命令セットを生成するため、実際の「有用な」コードを追加することなく、コードの量を増やし、さまざまな「コードワイヤリング」オーバーヘッドを追加すると想定しています。また、ASMが実際にハードウェアで実行される前に、ASMに対して適切な最適化を実行できることも想像しますが、その最適化を実行できるのはそれだけです。 したがって、私の質問-十分に分離されたコード(何百ものファイル、クラス、デザインパターンなどに分割されるコード)が(スペースと速度で)どのくらいのオーバーヘッドをもたらすかは、「このオーバーヘッドのために、すべてを1つのモノリシックファイルに」 明確にするために更新: 同じコードを取得して分割し、リファクタリングし、より多くの関数とオブジェクト、メソッド、クラスに分離することで、より小さなコード間でより多くのパラメーターが渡されると想定しています。確かに、リファクタリングコードはスレッドを継続する必要があり、そのためにはパラメーターを渡す必要があります。より多くのメソッドまたはより多くのクラスまたはより多くのファクトリメソッドのデザインパターンは、単一のモノリシッククラスまたはメソッドの場合よりも、さまざまな情報を渡すオーバーヘッドを増やします。 どこか(TBDを引用)では、すべてのコードの最大70%がASMのMOV命令で構成され、実際の計算ではなくCPUレジスタに適切な変数をロードすると言われていました。私の場合、PUSH / POP命令を使用してCPUの時間を増やし、さまざまなコード間でリンケージとパラメーターの受け渡しを行います。コードを小さくするほど、より多くのオーバーヘッド「リンケージ」が必要になります。このリンケージがソフトウェアの肥大化とスローダウンに追加することを懸念しており、これを心配する必要があるのか​​、もしあれば、どれくらいの量を心配する必要があるのか​​、次の世紀のソフトウェアを構築しているプログラマーの現在と将来の世代、これらのプラクティスを使用して構築されたソフトウェアと共存し、使用する必要があります。 更新:複数のファイル 古いコードを徐々に置き換えている新しいコードを書いています。特に、古いクラスの1つが〜3000行のファイルであったことに注意しました(前述のとおり)。今では、テストファイルを含むさまざまなディレクトリに配置された15〜20のファイルのセットになりつつあり、いくつかのものを結合するために使用しているPHPフレームワークは含まれません。さらに多くのファイルが来ています。ディスクI / Oに関しては、複数のファイルのロードは、1つの大きなファイルのロードよりも遅くなります。もちろん、すべてのファイルがロードされるわけではなく、必要に応じてロードされ、ディスクキャッシングとメモリキャッシングのオプションが存在しますが、それでもメモリloading multiple filesよりも多くの処理が必要になると思いloading a single fileます。それを懸念に加えています。 更新:依存性のすべてを注入 しばらくしてこれに戻って..私の質問は誤解されたと思います。または、いくつかの答えを誤解することを選んだかもしれません。いくつかの答えが出てきたので、マイクロ最適化については話していません(少なくとも、マイクロ最適化について話していることは間違った呼び方だと思います)。 、コードのあらゆるレベルで。私は最近、このスタイルのコードがコンベンションの中心的なポイントの1つであり、Zend Conから来ました。ビューからロジック、モデルからビュー、データベースからモデルを分離し、可能であればデータベースからデータを分離します。依存関係-すべてを挿入します。これは、何もしない配線コード(関数、クラス、ボイラープレート)を追加することを意味する場合があります、ただし、シーム/フックポイントとして機能し、ほとんどの場合、コードサイズを簡単に2倍にします。 更新2:「コードをより多くのファイルに分割する」ことは、パフォーマンスに大きな影響を与えますか(コンピューティングのすべてのレベルで) compartmentalize your code into multiple files今日のコンピューティング(パフォーマンス、ディスク使用率、メモリ管理、CPU処理タスク)の哲学はどのように影響しますか? …

3
依存性注入はどのように結合を増加させますか?
依存性注入に関するウィキペディアのページの短所セクションには、次のことが記載されています。 依存性注入は、サブシステムのユーザーにそのサブシステムのニーズを提供するように要求することにより、結合を増加させます。 依存性注入に対する記事へのリンク付き。 依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。その結果、結合が減少するはずです。 私は何が欠けていますか?依存性注入はどのようにクラス間の結合を増加させますか?

4
「制御の反転」は「貧血領域モデル」を促進しますか?
前回のプロジェクトでIoC Containerを使用したとき、貧弱なエンティティとステートレスサービスでのビジネスロジックの大部分になりました。 「Inversion of Control」を利用する他の開発者によって書かれたプロジェクトを見てきましたが、それらは常に「Anemic」です。 「Anemic Domain Model」はアンチパターンであるため、IoCとRich Domainを使用できますか?彼らの良い例、それを行うオープンソースプロジェクトはありますか?

6
どのクラスをSpringによって自動配線する必要がありますか(依存性注入を使用する場合)?
しばらくの間、SpringでDependency Injectionを使用してきましたが、それがどのように機能し、それを使用することの長所と短所を理解しています。しかし、新しいクラスを作成するとき、よく疑問に思う-このクラスはSpring IOC Containerによって管理されるべきか? また、@ Autowiredアノテーション、XML構成、セッターインジェクション、コンストラクターインジェクションなどの違いについては説明しません。私の質問は一般的なものです。 コンバーター付きのサービスがあるとしましょう: @Service public class Service { @Autowired private Repository repository; @Autowired private Converter converter; public List<CarDto> getAllCars() { List<Car> cars = repository.findAll(); return converter.mapToDto(cars); } } @Component public class Converter { public CarDto mapToDto(List<Car> cars) { return new ArrayList<CarDto>(); // do the mapping here …

4
インターセプトとインジェクション:フレームワークアーキテクチャの決定
私が設計を支援しているこのフレームワークがあります。いくつかの一般的なコンポーネントを使用して実行する必要があるいくつかの一般的なタスクがあります。特に、イベントのロギング、キャッシュ、および発生 依存関係の注入を使用してこれらのすべてのコンポーネントを各サービスに(たとえばプロパティとして)導入する方がよいのか、サービスの各メソッドに何らかの種類のメタデータを配置し、インターセプトを使用してこれらの一般的なタスクを実行するのか? 以下に両方の例を示します。 注入: public class MyService { public ILoggingService Logger { get; set; } public IEventBroker EventBroker { get; set; } public ICacheService Cache { get; set; } public void DoSomething() { Logger.Log(myMessage); EventBroker.Publish<EventType>(); Cache.Add(myObject); } } そして、ここに他のバージョンがあります: 傍受: public class MyService { [Log("My message")] [PublishEvent(typeof(EventType))] public void DoSomething() …

5
NInjectを使用して工場を建設する最良の方法は何ですか?
私は、MVC3でNInjectを使用した依存性注入にかなり満足しています。MVC3アプリケーションでの作業中に、私はNInjectを使用してカスタムコントローラー作成ファクトリを開発しました。そのため、作成されたコントローラーには、このコントローラーファクトリを介して依存関係が注入されます。 今、私はWindowsアプリケーションを開発し始めています、私はアプリケーション全体の依存性注入を使用したいと思います。つまり、ユニットテストを容易にするために、すべてのオブジェクトをNInjectを介して作成する必要があります。作成されたすべてのオブジェクトがNInject Factoryのみを通過するようにする必要があります。 たとえば、Button_Clickイベントで任意のWindowsフォームで次のように記述した場合: TestClass testClass = new TestClass() そしてTestClass、たとえば、上の任意の依存関係を持ってITest、それが自動的に解決されなければなりません。私が使用できることを知っています: Ikernel kernel = new StandardKenel() //AddBinding() TestClass testClass = kenel.get<TestClass>(); しかし、オブジェクトを作成するたびにこれを行うのは面倒です。また、開発者は特定の方法でオブジェクトを作成する必要があります。もっと良くできますか? オブジェクト作成用の中央リポジトリを作成すると、すべてのオブジェクト作成でそのリポジトリが自動的に使用されますか?

6
依存性注入; 定型コードを減らす良い習慣
簡単な質問があり、答えがあるかどうかはわかりませんが、試してみましょう。私はC ++でコーディングしており、グローバル状態を回避するために依存性注入を使用しています。これは非常にうまく機能し、予期しない/未定義の動作を頻繁に実行しません。 しかし、私のプロジェクトが成長するにつれて、定型的なものと考える多くのコードを書いていることに気づきました。さらに悪いことに、実際のコードよりも定型的なコードが多いため、理解が難しい場合があります。 良い例に勝るものはありません。 Timeオブジェクトを作成するTimeFactoryというクラスがあります。 詳細(関連があるかどうかはわかりません):Timeオブジェクトは非常に複雑です。Timeにはさまざまな形式があり、それらの間の変換は線形でも簡単でもないためです。各「Time」には、変換を処理するSynchronizerが含まれており、適切に初期化された同じシンクロナイザーを使用するために、TimeFactoryを使用します。TimeFactoryにはインスタンスが1つしかなく、アプリケーション全体であるため、シングルトンの資格がありますが、可変なので、シングルトンにしたくありません 私のアプリでは、多くのクラスがTimeオブジェクトを作成する必要があります。これらのクラスは深くネストされている場合があります。 クラスBのインスタンスを含むクラスAからクラスDまでのクラスAがあるとします。クラスDはTimeオブジェクトを作成する必要があります。 私の単純な実装では、TimeFactoryをクラスAのコンストラクターに渡します。クラスAは、クラスBのコンストラクターにそれを渡し、クラスDまで続きます。 ここで、TimeFactoryのようなクラスと上記のようなクラス階層がいくつかあると想像してください。依存性注入を使用すると考えられる柔軟性と読みやすさをすべて失います。 私は私のアプリに大きな設計上の欠陥がないのではないかと考え始めています...または、これは依存性注入を使用するのに必要な悪ですか? どう思いますか ?

9
依存性注入:フレームワークを使用する必要がありますか?
私は最近、依存関係の注入を頻繁に行うPythonプロジェクトに取り組みました(アプリをテスト可能にするために必要なため)が、フレームワークは使用しませんでした。すべての依存関係を手動で接続するのは少し面倒ですが、全体的にはうまくいきました。 オブジェクトを複数の場所で作成する必要があった場合、実稼働インスタンスを作成する関数(場合によってはそのオブジェクトのクラスメソッド)が必要でした。この関数は、そのオブジェクトが必要になるたびに呼び出されました。 テストでは、同じことを行いました。オブジェクトの「テストバージョン」を複数回作成する必要がある場合(つまり、モックオブジェクトに裏付けられた実際のインスタンス)、この「テストバージョン」を作成する機能がありました。クラスで、テストで使用されます。 私が言ったように、一般的にこれはうまくいきました。 私は現在、新しいJavaプロジェクトに参加しています。DIフレームワークを使用するか、DIを手動で実行するかを決定しています(前のプロジェクトのように)。 DIフレームワークでの作業がどのように異なり、手動の「バニラ」依存性注入よりも優れているか悪いかを説明してください。 編集:私も質問に追加したいと思います:フレームワークなしで手動でDIを行う「プロレベル」プロジェクトを目撃しましたか?

4
コンストラクターでの正当な「実際の作業」
私はデザインに取り組んでいますが、引き続き障害にぶつかっています。私は特定のクラス(ModelDef)を持っています。これは、本質的にXMLスキーマを解析することで構築された複雑なノードツリーの所有者です(DOMを考えてください)。優れた設計原則(SOLID)に従い、結果のシステムを簡単にテストできるようにします。DIを使用してModelDefのコンストラクターに依存関係を渡すつもりです(テスト中に必要に応じてこれらを簡単に交換できます)。 しかし、私が苦労しているのは、ノードツリーの作成です。このツリーは、個別にテストする必要のない単純な「値」オブジェクトで完全に構成されます。(ただし、これらのオブジェクトの作成を支援するために、Abstract FactoryをModelDefに渡すことができます。) しかし、私は、コンストラクターが実際の作業を行うべきではないことを読み続けています(例:Flaw:Constructor does Real Work)。「実際の作業」とは、後でテストのためにスタブアウトする可能性のある重い依存オブジェクトを構築することを意味する場合、これは私にとって完全に理にかなっています。(これらはDI経由で渡される必要があります。) しかし、このノードツリーなどの軽量の値オブジェクトはどうでしょうか。ツリーはどこかに作成する必要がありますよね?ModelDefのコンストラクター(buildNodeTree()メソッドなどを使用)を使用しないのはなぜですか? ModelDefの外でノードツリーを作成してから(コンストラクターDIを介して)渡したいとは思いません。スキーマを解析してノードツリーを作成するには、かなりの量の複雑なコードが必要です。 。私はそれを「グルー」コードに委ねたくありません(これは比較的簡単なはずで、おそらく直接テストされません)。 ノードツリーを作成するためのコードを別の「ビルダー」オブジェクトに入れることを考えましたが、実際にはビルダーパターン(テレスコープの排除に関心があると思われる)と一致しないため、「ビルダー」と呼ぶことをためらいます。コンストラクター)。ただし、別の名前(NodeTreeConstructorなど)を呼び出したとしても、ModelDefコンストラクターがノードツリーを構築するのを避けるために、ちょっとしたハックのように感じます。どこかに構築する必要があります。なぜそれを所有しようとしているオブジェクトではないのですか?

2
ドメイン駆動設計-エンティティ問題の外部依存関係
Domain-Driven-Designを開始したいのですが、開始する前に解決したい問題がいくつかあります:) グループとユーザーがあり、ユーザーがグループに参加したい場合、groupsService.AddUserToGroup(group, user)メソッドを呼び出していると想像してください。DDDで行う必要がgroup.JoinUser(user)あります。 ユーザーを追加するための検証ルールがある場合、またはユーザーがグループに追加されたときに外部タスクを開始する必要がある場合に問題が発生します。これらのタスクを実行すると、エンティティが外部依存関係を持つことになります。 例としては、ユーザーが最大3グループまでしか参加できないという制限があります。これを検証するには、group.JoinUserメソッド内からのDB呼び出しが必要です。 しかし、エンティティがいくつかの外部サービス/クラスに依存しているという事実は、私にはそれほど自然で「自然」ではないようです。 DDDでこれに対処する適切な方法は何ですか?

7
.NETにDIを実装する「正しい」方法は何ですか?
比較的大きなアプリケーションに依存性注入を実装したいと考えていますが、経験はありません。私は、UnityやNinjectなどのIoCの概念といくつかの実装、および利用可能な依存関係インジェクターを研究しました。しかし、私を避けているものが1つあります。アプリケーションでインスタンス作成を整理するにはどうすればよいですか? 私が考えているのは、いくつかの特定のクラスタイプのオブジェクトを作成するロジックを含むいくつかの特定のファクトリを作成できるということです。基本的に、このクラスの静的カーネルインスタンスのNinject Get()メソッドを呼び出すメソッドを持つ静的クラス。 アプリケーションに依存性注入を実装する正しいアプローチでしょうか、それとも他の原則に従って実装する必要がありますか?

4
関数型プログラミングは、依存性注入パターンの実行可能な代替手段ですか?
私は最近、C#での関数型プログラミングというタイトルの本を読んでいます。関数型プログラミングの不変でステートレスな性質は、依存性注入パターンと同様の結果を達成し、特にユニットテストに関してはより良いアプローチである可能性があります。 両方のアプローチの経験がある人なら誰でも、主な質問に答えるために自分の考えや経験を共有できれば感謝しています。

6
DI / IoCを使用すると、「新しい」キーワードの出現をすべて削除する必要がありますか?
Dependency InjectionとInversion of Controlコンテナを使用すると、コードから" "キーワードがすべて削除さnewれますか? 言い換えれば、どのオブジェクト/依存関係も、どれほど単純または短命であっても、IoCコンテナー内に「登録」し、それらを使用する必要があるメソッド/クラスに注入する必要がありますか? いいえの場合、依存関係/オブジェクトがIoCコンテナに登録される線と、具体的な参照として「インライン」で作成されるものとの間に、newキーワードを介してどこで線を引きますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.