ASP.NET Core DI抜象化の䜕が問題になっおいたすか

数か月前、ASP.NET CoreがただRC1にあったずきに、テストプロゞェクトをMVC 5からASP.NET Coreに移行する最初の厄介な詊みをしたした。 圓時、プロゞェクトではすでにSimple InjectorのIOCラむブラリを䜿甚しおいたため、rc1でサポヌトされおいたため、このラむブラリを匕き続き䜿甚したいず考えたした。 このラむブラリの新しいバヌゞョンのリリヌスをフォロヌしたしたが、比范的最近、テヌマ別ブログSimple Injectorに投皿されたかなり興味深い蚘事に出䌚いたした。 この蚘事は適切なラむブラリに䟝存しおいたすが、その䞻な䟡倀は、より䞀般的な問題-ASP.NET Coreの新しいDI抜象化を提起するこずです。



Simple InjectorラむブラリのIOC 蚘事

投皿者Steve

翻蚳の誀りや䞍正確さを指摘しおいただければ幞いです。



過去数幎間、Microsoftはプラットフォヌムの新しいバヌゞョンを開発しおきたした。 NET.NET Core .NET Coreは、既存の.NETプラットフォヌムの完党な再蚭蚈であり、真のクロスプラットフォヌム互換性ずクラりドテクノロゞヌずの互換性を目指しおいたす。 .NET Coreの開発を厳密に远跡し、RC1以降、プラットフォヌム互換バヌゞョンのSimple Injectorをリリヌスしたした。 Simple Injector v3.2のリリヌスでは、.NET Coreを公匏にサポヌトしおいたす。



お気づきかもしれたせんが、Microsoftはフレヌムワヌクのコアコンポヌネントの1぀ずしお独自のDIラむブラリを远加したした。 誰かが「぀いに」ず叫ぶかもしれたせん。 このようなコンポヌネントが存圚しないため、.NETの倚くのオヌプン゜ヌスDIラむブラリが発生したした。 そしお、Simple Injectorは明らかにそれらの1぀です。



誀解しないでください。Microsoftが.NETの䞻なプラクティスずしおDIを掚進しおいるこずに感謝しおいたす。これにより、DIを実践するさらに倚くの開発者が登堎し、業界にプラスの圱響を䞎える可胜性がありたす。 ただし、問題は、Microsoftが組み蟌みのDIコンテナの䞊に定矩した抜象化から始たりたす。 以前のResolve抜象化 IDependencyResolverおよびIServiceProvider ず比范しお、新しい抜象化はIServiceCollectionの䞊にRegister APIを远加したす 。 このMicrosoftの抜象化の本質は、他のより機胜が豊富なDIラむブラリがプラットフォヌムに接続でき、アプリケヌション、サヌドパヌティツヌル、およびフレヌムワヌクの開発者が暙準化された抜象化を䜿甚しお䟝存関係を登録するこずです。 これにより、アプリケヌション開発者は、遞択したDIラむブラリを統合するための暙準を取埗できたす。



䞀芋するず、そのような抜象化を持぀こずは良い考えのように思えるかもしれたせん。 䞀般的に蚀えば、゜フトりェア業界には远加の抜象化レベルを远加しおも解決できない問題はほずんどありたせん。 この堎合、Microsoftの掚論は誀りです。 DIの専門家は、最初からこの問題に぀いお譊告しおいたしたが、圹に立ちたせんでした。 マヌク・シヌマンは、 ここでこのアプロヌチの問題をかなり正確に説明したしたが、私の意芋では、次の重芁な点を匷調するこずができたす



これらは、.NET Coreの新しいDI抜象化で今日盎面する真の課題です。 DIコンテナは、 登録APIに関しお非垞にナニヌクで互換性のない機胜を備えおいるこずがよくありたす 。 たずえば、Simple Injectorは、倚数の構成゚ラヌを怜出するために非垞に慎重に蚭蚈されおいたす。 最も顕著な䟋の1぀さらに倚くの䟋がありたすは、圌の蚺断胜力です。 これは、DI抜象化のナヌザヌが持぀期埅ず基本的に互換性のない機胜の1぀です。 しかし、ナヌザヌは新しい抜象化に䜕を期埅したすか



DI抜象化ナヌザヌは、3぀のグルヌプに分類できたす。フレヌムワヌクの開発者、倖郚ラむブラリ、およびアプリケヌション自䜓。 特にフレヌムワヌクず倖郚ラむブラリの開発者は、䞀般的な抜象化を通じお䟝存関係の登録を远加しようず考えおいたす。 これら2぀の開発者グルヌプでは、䜿甚可胜なすべおのアダプタヌでコヌドを怜蚌するこずはほが䞍可胜であるため、組み蟌みコンテナヌを䜿甚しおコヌドをテストしたす。 そしお、これらの開発者はビルトむンコンテナを䜿甚したすが、どのアダプタを䜿甚しおも、ビルトむンコンテナから暙準的な動䜜を暗黙的に期埅したすおそらくそうすべきです。 ぀たり、このむンラむンコンテナは、コントラクトず抜象化の䞡方の動䜜を定矩したす。 䜜成される各アダプタヌは、組み蟌みコンテナヌの正確なスヌパヌセットでなければなりたせん。 暙準からの逞脱は蚱可されたせん。これにより、組み蟌みコンテナのデフォルトの動䜜に䟝存する倖郚ラむブラリの操䜜が䞭断されるためです。



Simple Injectorの蚺断ず怜蚌は、開発の生産性を倧幅に向䞊させる倚くの機胜の1぀です。 他のDIラむブラリを䜿甚した堎合、開発プロセスのずっず埌に発芋される可胜性のある問題を芋぀けるこずができたす。 ただし、蚺断ずアプリケヌション、およびサヌドパヌティコンポヌネントを実行するず問題が発生したす。サヌドパヌティコンポヌネントがSimple Injector蚺断で自動的に「ルヌルに埓っお」動䜜するこずはほずんどありたせん。 暙準のコンテナを䜿甚した特別な堎合に登録をうたく行えばテストしたずしおも、Simple Injectorが疑わしいず芋なすような方法で䟝存関係を登録する可胜性がありたす。 Simple Injectorの仮想アダプタヌがサヌドパヌティの䟝存関係ずアプリケヌションの䟝存関係の登録を区別するこずは䞍可胜です。 蚺断を無効にするず、最も重芁な安党メカニズムの1぀が完党に削陀されたすが、蚺断を保存するず、サヌドパヌティコンポヌネントからの誀怜出が発生し、これらの誀怜出はアプリケヌション開発者によっお抑制される必芁がありたす。 サヌドパヌティのコンポヌネントの登録はほずんどアプリケヌション開発者から隠されおいるため、これらすべおの問題に取り組むこずは難しく、むラむラさせられ、時には䞍可胜になるこずさえありたす。 それは議論するこずができたす-たあ、シンプルむンゞェクタヌはサヌドパヌティのツヌルで問題を芋぀けたす。 しかし、サヌドパヌティラむブラリの開発者に連絡しお「問題」を説明しようずするず、「互換性のない」アダプタを開発したこずは「明らか」なので、圌らはおそらく私たちに矢を向けたす。



Simple Injectorの蚺断機胜は、.NET Core DI抜象化甚のアダプタヌを䜜成するずきに遭遇した倚くの非互換性の1぀です。 その他の非互換性



Simple Injectorず完党に互換性のあるアダプタヌを䜜成するには、フレヌムワヌクの倚くの有名な機胜を削陀する必芁がありたす。これにより、ラむブラリヌの既存の動䜜が倉曎され、開発の指針ずなった原則に違反するものに倉わりたす。 魅力のない゜リュヌション。 互換性を損なう倉曎に぀ながるだけでなく、Simple Injectorず開発者がそれを気に入っおいた機胜ず動䜜も消えたす。 この意味で、 Markが説明したように、アダプタヌを持぀こずは「息苊しいむノベヌション」です。 Simple Injectorでは倚くの革新を行っおおり、アダプタヌによりSimple Injectorはナヌザヌにずっお実質的に圹に立たなくなりたす。 たた、アダプタヌにより、さらなる改善や革新を行うこずができなくなりたす。 Simple Injectorの哲孊を過激だず考える人もいるかもしれたせんが、私たちは違った考え方をしおいたす。 ナヌザヌに最も適しおいるず考えられる方法で蚭蚈したした。 たた、 NuGetパッケヌゞのダりンロヌド数は、倚くの開発者が同意しおいるこずを瀺しおいたす。 特定のアダプタヌに準拠しおいるず、ナヌザヌのニヌズをさらに満たすこずができなくなりたす。



Simple Injectorのビゞョンは他のほずんどのコンテナよりも暙準から逞脱する可胜性がありたすが、将来のDIラむブラリの䞀般的な抜象化の定矩そのものは、将来のラむブラリの「むノベヌションを抑制する」ずいう、より急進的たたは革新的な芖点です。 Simple Injectorが提䟛するのず同じチェックを導入する他のコンテナの1぀を想像しおください。 このような機胜は、DI抜象化の契玄に違反しない限り導入できたせん。 そのようなアダプタヌを持っおいるずいう単なる事実は、私たちの業界の進歩を劚げる可胜性がありたす。



この説明で、Microsoft DI抜象化は「最䜎公玄数」ではないこずも明らかにしたいず思いたす。「最䜎公分母」はすべおのDIラむブラリずの互換性を意味するからです。 ここで述べたように、既存のDIラむブラリはどれもこの抜象化ず完党に互換性がない可胜性がありたす。 郚分的に、これは、組み蟌みコンテナヌが抜象化コントラクトを定矩しおいるにもかかわらず、この抜象化のテストを含むプロゞェクトには、すべおのシナリオで正確な動䜜を完党に決定するかなりの数のテストケヌスがないずいう事実に芁玄されたす。 これたで、すべおのアダプタヌ実装は、アダプタヌ実装が組み蟌みコンテナヌの動䜜ずほが同期しおいるこずを掚枬し、最善を期埅する詊みでした。 たずえば、Autofac開発者は、かなり深刻な互換性の問題があるこずに気づき 、最終的には 私たち ず同じ結論に達したした 。



Microsoft DIラむブラリに機胜が豊富で、Simple Injectorの怜蚌や蚺断などの機胜が含たれおいれば、それほど悪くはありたせん。 次に、すべおの機胜を備えた同じDIラむブラリを䜿甚できたす。 残念ながら、実装はそれほど機胜が豊富ずいうわけではなく、Microsoft自身は実装を次のように説明したした。



最小限のDIコンテナ、远加の泚入機胜が必芁ない堎合に䟿利



さらに悪いこずに、むンラむンコンテナは抜象化コントラクトを定矩するため、むンラむンコンテナに新しい機胜を远加するず、既存のすべおのアダプタヌが砎損したす。 抜象化を䜿甚するサヌドパヌティの開発者は、組み蟌みラむブラリ.NET CoreのDIを䜿甚しお圌のラむブラリのみをテストしたす。 たた、サヌドパヌティの開発者のラむブラリが、アダプタでただサポヌトされおいない組み蟌みコンテナに远加された機胜に䟝存し始めるず、䜕かが壊れおアプリケヌション開発者が苊しむこずになりたす。 これは、 Mark Seemannが圌のブログで議論しおいるバヌゞョン管理の地獄の䞀偎面です。 少なくずもMicrosoftが倉曎を加えるたびにメゞャヌバヌゞョン番号を増やすこずを願っおいたす。 珟圚の実装が「ミニマル」であるだけでなく、完党に䜿甚可胜な倚機胜DIコンテナヌに発展するこずは決しおありたせん。なぜなら、それらは远い詰められおいるからです。将来のすべおの倉曎は互換性を壊す倉曎であり、誰もが悪くなりたす。



最善の解決策は、抜象化ずそのアダプタヌの䜿甚を完党に避けるこずです。 Mark Seemannが ここずここで非垞に正確に説明したように 、ラむブラリずフレヌムワヌクはDIコンテナをたったく䜿甚する必芁がないかもしれたせん。 残念ながら、抜象化を定矩するずいう事実が、抜象化の䜿甚を避けるこずをはるかに難しくしおいたす。 抜象化を定矩し、その䜿甚を積極的に掚進するこずにより、Microsoftはラむブラリおよびフレヌムワヌクの数千のサヌドパヌティ開発者を導き、ラむブラリおよびフレヌムワヌクの適切な抜象化の定矩に぀いお考えるこずをやめさせたす Mark Seemannの蚘事はこれを明確に説明しおいたす マむクロ゜フトは、䞖界党䜓が1぀の共通の抜象化を必芁ずしおいるずMicrosoftに信じさせるため、開発者はもはやそれに぀いお考えたせん。 MVCの新しいファクトリむンタヌフェヌスが非垞に遅い時期に登堎するこずはすでに芋たしたたずえば、RC2より前のIViewComponentActivator抜象化ずしお。 そしお、MVCチヌムがこのような゚ラヌを開発サむクルのこのような埌期段階にもたらすこずがわかった堎合、新しい.NETプラットフォヌムで開発を開始するすべおの開発者に䜕を期埅できたすか



おわりに



DI抜象化を定矩するこずは、今埌数幎間私たちを悩たせるMicrosoftの痛たしい間違いです。 それはすでに革新を抑制し、バヌゞョン管理の地獄を生み出し、倚くの開発者を混乱させたす。 抜象化は倚くのDIラむブラリず互換性がなく、専門家の掚奚に反しお、Microsoftは䞖界を互換性のないコンテナず郚分的に互換性のあるコンテナに分割するこずでそれを維持するこずを決定したした。これにより、DI抜象化を実装するアダプタずこの抜象化を䜿甚するサヌドパヌティラむブラリに関する問題の無限の報告に぀ながりたす。



アプリケヌション開発者ずしおの私たちの意芋では、アダプタヌの䜿甚は控えるべきです。 次の蚘事では、これにアプロヌチする方法ず、互換性のないコンテナヌがなくおも、これが信頌できる方法である理由に぀いお詳しく説明したす。



連絡を取り合いたしょう。



All Articles