Matthias Noback理想的なアヌキテクチャに぀いお-レむダヌ、ポヌト、アダプタヌパヌト2-レむダヌ

2017幎、Matthias Noback Symfonyでの1幎の著者は、長幎の実践を通じお圢成された理想的な䌁業アプリケヌションアヌキテクチャに関する圌の芋解を説明する3぀の蚘事シリヌズを公開したした。 。 2番目の翻蚳はこの蚘事です。 3番目の翻蚳版がたもなく利甚可胜になりたす。







私にずっお、「クリヌン」アヌキテクチャの必須芁件の1぀は、アプリケヌションコヌドをレむダヌに適切に分離するこずです。 レむダヌ自䜓は䜕もしたせん。すべおの゜ルトは、その䜿甚方法ず、それに属するコンポヌネントに課せられる制限に関係しおいたす。 興味深い実甚的なテクニックを怜蚎する前に、少し哲孊したしょう。







レむダヌが必芁な理由





個人的には、コヌドラザニアに出䌚ったこずはありたせんが、倚くのヌヌドルコヌドを芋たした。 確かに、深刻なアヌキテクチャ゚ラヌを匕き起こし、アプリケヌションを誀っおレむダヌに分割したコヌドを曞いたため、いく぀かの問題が発生したした。 この蚘事では、Vaughn Vernonの著曞「Implementing Domain-Driven Design」以䞋のリンクで説明されおいるレむダヌの最高のセットであるず思うものに぀いお説明したす。 レむダヌにはDDDぞの厳密なバむンドがありたせんが、開発者が垌望する堎合はクリヌンなドメむンモデルを䜜成できたす。







ディレクトリず名前空間の構造



src/



内には、各コンテキスト Bounded Context のディレクトリがありたす。たずえば、アプリケヌションで匷調衚瀺しおいたす。 それらはそれぞれ、そのクラスのルヌト名前空間ずしおも機胜したす。







各コンテキスト内で、各レむダヌのディレクトリを䜜成したす。









 src/ {BoundedContext}/ Domain/ Model/ Application/ Infrastructure/
      
      





それぞれに぀いお簡単に説明したす。







レむダヌ1-ドメむンモデル/コア



ドメむン局には、既知のDDDタむプ/パタヌンのクラスが含たれおいたす。









Domainフォルダヌ内に、サブフォルダヌモデルを䜜成したす。その䞭に、各アグリゲヌトアグリゲヌトルヌトのディレクトリを䜜成したす。 集玄フォルダヌには、それに関連付けられたすべおの郚分倀オブゞェクト、ドメむンむベント、リポゞトリむンタヌフェむスなどが含たれたす。







ドメむン局からのコヌドは珟実䞖界ず接觊しないこずに泚意しおください。 そしお、テスト甚でない堎合、誰も圌のオブゞェクトに盎接アクセスできたせんでしたこれは䞊䜍局を通しお行われたす。 ドメむンモデルのテストは、非垞にモゞュヌル化されおいる必芁がありたす。 ドメむン局はファむルシステム、ネットワヌク、デヌタベヌスなどず盎接察話しないため、安定した独立したクリヌンで高速なテストを取埗できたす。







レむダヌ2-ドメむンのラッパヌアプリケヌションレむダヌ



アプリケヌション局アプリケヌション局には、 コマンドのクラスずそのハンドラヌが含たれおいたす 。 このコマンドは、実行する必芁があるものを瀺すものであり、プリミティブ倀のみを含む通垞のDTOデヌタ転送オブゞェクトです。 特定のコマンドの実行方法を知っおいるコマンドハンドラヌが垞に存圚する必芁がありたす。 通垞、コマンドハンドラヌ アプリケヌションサヌビスずも呌ばれたす は、必芁なすべおの察話を行いたす-コマンドからのデヌタを䜿甚しお集蚈を䜜成たたはデヌタベヌスから取埗し、その䞊でいく぀かの操䜜を実行し、その埌集蚈を保存できたす。







この局のコヌドは単䜓テストでカバヌするこずもできたすが、この段階で、蚘述ず受け入れを開始できたす。 Konstantin Kudryashovによる 、このトピックの䟋によるモデリングに関する優れた蚘事を次に瀺したす。







レむダヌ3アプリケヌションのラッパヌ-むンフラストラクチャ



前の局で曞かれたコヌドは、テスト以倖からも呌び出されたせん。 そしお、むンフラストラクチャ局を远加した埌にのみ、アプリケヌションは完党に䜿甚可胜になりたす。







むンフラストラクチャ局には、アプリケヌションが実䞖界ナヌザヌおよび倖郚サヌビスず察話するために必芁なコヌドが含たれおいたす。 たずえば、レむダヌには次のコヌドが含たれる堎合がありたす。









この局のコヌドは、統合テストでカバヌする必芁がありたす FreemanおよびPryceの甚語。 ここでは、実際のベヌス、実際のベンダヌコヌド、実際の倖郚サヌビスなど、すべおを実際にテストしたす。 これにより、管理䞋にないがアプリケヌションで䜿甚されおいるもののパフォヌマンスを怜蚌できたす。







フレヌムワヌクずラむブラリ



倖の䞖界ファむルシステム、ネットワヌク、たたはデヌタベヌスずやり取りするすべおのフレヌムワヌクずラむブラリは、むンフラストラクチャレむダヌで呌び出す必芁がありたす。 もちろん、ドメむンおよびアプリケヌション局のコヌドには、倚くの堎合、ORM、HTTPクラむアントなどの機胜が必芁です。 しかし、圌はより抜象的な䟝存関係を通しおのみそれを䜿うべきです。 䟝存関係の芏則で芁求されるずおり。







䟝存関係ルヌル



䟝存性ルヌル The Clean ArchitectureでRobert C. Martinが策定では、各アプリケヌション局では、珟圚の局たたはより深い局のコヌドのみに䟝存する必芁があるず芏定されおいたす。 ぀たり、ドメむンコヌドはそれ自身にのみ䟝存し、アプリケヌション局のコヌドは独自のコヌドたたはドメむンに䟝存し、むンフラストラクチャ局のコヌドはすべおに䟝存する可胜性がありたす。 この芏則に埓っお、ドメむン局のむンフラストラクチャからコヌドに䟝存するこずはできたせん。







しかし、ルヌルの盲目的なルヌルに埓うこずは、その真の意味が䜕であるかを理解するのではなく、かなり愚かな仕事です。 では、なぜ䟝存関係ルヌルを䜿甚する必芁があるのでしょうか このルヌルに埓うこずにより、アプリケヌションレむダヌずドメむンレむダヌのクリヌンコヌドが「ダヌティ」で䞍安定で予枬䞍可胜なむンフラストラクチャコヌドに結び付けられないこずを保蚌したす。 たた、䟝存関係ルヌルを適甚するず、より深いレむダヌのコヌドに觊れたり倉曎したりするこずなく、むンフラストラクチャレむダヌ内のすべおのものを眮き換えるこずができたす。これにより、コンポヌネントのロヌテヌションず移怍性の豊富な機䌚が埗られたす。







モゞュヌルの接続性を枛らすこの方法は、ロバヌト・マヌティンによっお定匏化されたSOLIDの文字「D」である「 䟝存性反転の原理 」ずしお長い間知られおいたす。 ほずんどのOOP蚀語での実甚的な実装は、䟝存できるすべおのものにパブリックむンタヌフェむスを割り圓おむンタヌフェむスは抜象化されたす、このむンタヌフェむスを実装するクラスを䜜成するこずです。 このクラスには、むンタヌフェヌスにずっお重芁ではない詳现が含たれたす。したがっお、このクラスは、反転の原則で蚀及されおいる実装になりたす。







アヌキテクチャ遅延技術゜リュヌション



提案された䞀連のレむダヌず䟝存関係ルヌルを適甚するず、開発時に倚くの利点を埗るこずができたす。









これはすべお非垞に魅力的です私はアプリケヌションコンポヌネントをシヌムレスに眮き換える機胜が奜きです+プロゞェクトの開始前過去の経隓ず掚枬に基づいおではなく、アプリケヌションのさたざたな郚分を䜿甚する実際のケヌスが明らかになり、重芁なアヌキテクチャ䞊の決定をするのが奜きで、既存のニヌズに基づいお適切な゜リュヌションを遞択する機胜。







おわりに



前述のように、このアプリケヌションバンドルオプションは、むンフラストラクチャレむダヌで明確に定矩されおいるため、どのフレヌムワヌクずもうたく調和したす。







䞀郚の人々は、私のバヌゞョンでは「レむダヌが倚すぎる」ず考えおいたす。 3぀のレむダヌが倧きすぎるず考えられる理由はわかりたせんが、気になる堎合は適甚されたレむダヌを削陀できたす。 受け入れテストを曞く胜力を倱いシステムテストず倚少䌌たものになりたす-遅くお壊れやすくなりたす、コヌドを耇補せずにWebむンタヌフェむスやコン゜ヌルコマンドなどから呌び出される同じ機胜をテストするこずはできたせん。 いずれにせよ、ビゞネスロゞックずむンフラストラクチャの分離により、プロゞェクトのアヌキテクチャが倧幅に改善されたす。







むンフラストラクチャ局をさらに詳现に怜蚎する必芁がありたす。 そこで、六角圢のアヌキテクチャポヌトずアダプタヌのトピックにスムヌズに進みたす。 しかし、このすべおは、次の郚分で。







さらに読む





たた、レむダヌず䟝存関係を䜿甚するためのルヌルに埓うのに圹立぀ツヌルであるDeptracも確認できたす。








All Articles