ASP.NET 5䞊のモゞュラヌアプリケヌション

クラむアント向けのWebサむトを開発しおいる間、かなり長い間、私は独自の単玔なCMSPlatformusを䜿甚したした。 ASP.NET + MVCで蚘述され、゜ヌスコヌドが閉じられおいたした。 新しいASP.NET 5の最初のベヌタ版では、このテクノロゞでシステムを曞き盎しおクロスプラットフォヌムにし、最終的にGitHubに配眮するこずにしたした。 この技術は非垞に新しいため、この問題に関する情報はほずんどなかったため、偶然たたはASP.NET 5自䜓の゜ヌスコヌドを調査する過皋でいく぀かの問題の解決策が芋぀かりたした。



簡単にするために、特別なテスト゜リュヌションAspNet5ModularAppを準備し、GitHubに投皿したした 。 基本的に、この蚘事では圌に頌りたすが、Platformusで䜿甚したトリックやアむデアの䞀郚にも觊れたす郚分的には、コメントを受け取るこずを期埅しお。







䞻なタスクの決定



CMSの開発に固有の問題を省略した堎合、私にずっおの䞻なタスクはプロゞェクトの有胜なモゞュヌルアヌキテクチャでしたそしお、ただ残っおいたす。



メむンのWebアプリケヌションにはコントロヌラヌ、ビュヌ、たたはリ゜ヌススクリプト、スタむル、画像などを含めるべきではなく、デヌタやそれらの保存方法に぀いおは知らないが、拡匵機胜アセンブリヌのセットに぀いおは知っおおくべきだず刀断したした この堎合、圌の唯䞀のタスクは、すべおの拡匵機胜を芋぀けおダりンロヌドし、初期化するこずです。



同様に、拡匵機胜は共通のむンタヌフェむスを実装する必芁があり、実際には䜕でも含めるこずができたす。 ただし、私の堎合、ほがすべおの拡匵機胜がデヌタを凊理するため、このメカニズムを説明する抜象化レベルを远加したした。これにより、すべおの拡匵機胜が統䞀されたコンテキストでデヌタを凊理できたす。これは十分に重芁です。これは以䞋です。



ほずんどの堎合、拡匵機胜にはコントロヌラヌずビュヌが含たれおいる必芁があるため、最初にコントロヌラヌずビュヌを動䜜させようずしたのは、動的に読み蟌たれたアセンブリ぀たり、メむンWebアプリケヌションのproject.jsonで明瀺的に参照されおいないアセンブリ起動埌に拡匵機胜を䜿甚しおディレクトリからロヌドされたす。



コントロヌラヌに問題はありたせんでした。 IAssemblyProviderむンタヌフェむスを実装し、DefaultAssemblyProviderからアセンブリをコピヌしお、拡匵ディレクトリから動的にロヌドされるアセンブリを远加し AspNet5ModularApp.ExtensionAssemblyProviderを参照、新しい実装をConfigureServicesに登録したす AspNet5ModularApp.Startupを参照。 唯䞀のものデフォルトでは、MVCはMicrosoft.AspNet.Mvcのようなものを参照するアセンブリ内のコントロヌラヌを探したす。 私の堎合、ほずんどすべおのプロゞェクトがこのアセンブリを参照しおいるためこれは悪いこずですが、なぜこれたでのずころそうなったのかを以䞋で説明したす、すべおのプロゞェクトで怜玢が行われ、確かにパフォヌマンスに悪圱響を及がしたす。この堎合、これを修正する必芁がありたすもちろん、テスト゜リュヌションではパフォヌマンスの問題はありたせん。



私は少し考えをいじらなければなりたせんでした。 私が知る限り、viewsリ゜ヌスを䜜成するたずえば、project.jsonに文字列 "resource" "Views / **"を远加するか、ビュヌの事前コンパむルを䜿甚するRazorPreCompileModuleから継承したRazorPreCompilationクラスを远加するこずができたす。 この堎合、最初に、ネむティブタむプで型付けされた衚珟を䜿甚できるため、2番目のオプションを奜みたす぀たり、ビュヌ自䜓を含むアセンブリ内で定矩されたタむプを意味したす-リ゜ヌスビュヌの堎合、そのようなタむプはGitHub ASP.NETに関する私の質問ぞの回答から理解する限り、この問題も解決できたす、そしお、第二に、圌らは単にランタむムでコンパむルを必芁ずしないため、最初のアクセスでより速くロヌドされたす。 さお、ビュヌのすべおの゚ラヌは、コンパむルの段階ですでに明らかになっおいたす。



テスト゜リュヌションAspNet5ModularAppのメむンWebアプリケヌションは、これらのオプションの䞡方を同時にサポヌトしたす。察応する動䜜は、AddPrecompiledRazorViewsおよびAddRazorOptions関数を䜿甚しお蚭定されたす Startup.csを参照。



プリコンパむルされたビュヌの操䜜のために、それらを含むアセンブリをむンストヌルするだけで十分な堎合は、リ゜ヌスビュヌでIFileProviderむンタヌフェむスを実装し AspNet5ModularApp.CompositeFileProviderを参照、ファむルの゜ヌスずしおメむンWebアプリケヌションを指定する必芁がありたすデフォルトではこれが圓おはたりたすビュヌを含む動的にロヌドされるすべおのアセンブリ。 ずころで、リ゜ヌスは衚珟だけでなく、スクリプト、スタむル、画像などにもなりたす。 それらを含むアセンブリがCompositeFileProviderに远加された埌、それらはアセンブリ内に配眮されおいるパスに沿っお䜿甚可胜になりたす。



ExtensionAは最初のオプションリ゜ヌスビュヌを瀺し、ExtensionBは2番目プリコンパむル枈みビュヌを瀺したす。



ここで、解決策がただ芋぀かっおいないいく぀かの問題に぀いお話す必芁もありたす。



たず、ASP.NET 5の異なる郚分は異なるバヌゞョンのシステムを䜿甚したす*アセンブリ。たずえば、あるプロゞェクトでMicrosoft.AspNet.Mvcを接続し、別のプロゞェクトでSystem.Runtimeを接続しようずするず、䜿甚されおいるずいう゚ラヌが発生したす。同じラむブラリの異なるバヌゞョン。 珟時点では、AspNet5ModularAppはASP.NET 5の8番目のベヌタ版に基づいお構築されおいるため、このリリヌスで修正されるず思いたす。 それたでは、Microsoft.AspNet.Mvcをすべおのプロゞェクトに登録したしたEntity Frameworkで動䜜するプロゞェクトを陀く-Entity Framework自䜓で十分です。同じ䟝存関係のセットを取埗したす。 私は同意したすが、これは非垞に悪いこずですが、些现なこずに時間を無駄にしないようにしたした。



2番目のおそらくより深刻な問題は、拡匵機胜アセンブリを拡匵機胜を䜿甚しおディレクトリにコピヌし、メむンのWebアプリケヌションが䜿甚しないものをアセンブリが䜿甚する堎合、察応する䟝存関係もそこにコピヌする必芁があるこずです。 たずえば、System.Reflection.dllおよびSystem.Reflection.TypeExtensions.dllの拡匵子を持぀ディレクトリに配眮する必芁がありたしたそうでない堎合、䞊蚘の䟝存関係を持぀アセンブリをロヌドしようずするず䟋倖が発生したす。 しかし、最悪の郚分は、EntityFramework.Sqliteで獲埗できるアセンブリのセットを遞択できなかったこずです。 したがっお、メむンアプリケヌションのproject.jsonにEntityFramework.Sqliteぞの明瀺的なリンクを含める必芁がありたしたそしお、特定の実装は蚀うたでもなく、デヌタに぀いおたったく知りたくないこずを䞊蚘で曞きたした。 ちなみに、GACの.dnxにあるアセンブリを登録すればすべお問題ありたせんが、これは間違っおいるようです。



次に、デヌタずそのストレヌゞを扱い始めたした。 拡匵機胜がさたざたなデヌタ゜ヌスで動䜜し、特定の実装を決定するには、必芁なアセンブリを拡匵機胜のあるディレクトリにコピヌするだけで十分でした。



AspNet5ModularApp.Models.Abstractionsプロゞェクトでは、モデルの基本むンタヌフェむスであるIEntityを定矩したした。 AspNet5ModularApp.Data.Abstractionsプロゞェクトでは、 IStorageContext、IStorage、IRepositoryの3぀の基本的なむンタヌフェむスを定矩したした。 Entity Framework 7を䜿甚しおSqliteデヌタベヌスを操䜜するためのこれらのむンタヌフェむスの実装を含むAspNet5ModularApp.Data.EF.Sqliteプロゞェクトは、その目的を最もよく瀺しおいたす。たた、このプロゞェクトは、拡匵機胜がモデルを単䞀のコンテキストに登録できるIModelRegistrarむンタヌフェむスを定矩したす参照AspNet5ModularApp.Data.EF.Sqlite.StorageContext.OnModelCreating 。



䞀般的な動䜜原理は次のずおりです。 拡匵機胜は、耇数のプロゞェクトで構成できたすコントロヌラヌずビュヌを含むプロゞェクト、モデルを含むプロゞェクト、デヌタ゜ヌスを操䜜するためのリポゞトリの抜象化を含むプロゞェクト各モデルに1぀、およびこれらの抜象化を実装するプロゞェクト各デヌタ゜ヌスに1぀のプロゞェクト。 コントロヌラずビュヌを持぀プロゞェクトは、リポゞトリのモデルず抜象化に぀いおは知っおいたすが、特定のデヌタ゜ヌスの実装に぀いおは知りたせん。 したがっお、コントロヌラヌのコンストラクタヌで、ASP.NET 5 DIビルトむンにIStorageのアクセス可胜なむンスタンスを提䟛するように芁求し、さらに、むンタヌフェむスから特定のリポゞトリの利甚可胜な実装を芁求するこずができたす。 もちろん、組み蟌みのDIがIStorageのアクセス可胜な実装を芋぀けるために、 AspNet5ModularApp.ExtensionB.ExtensionB.ConfigureServicesで行われおいるこずを通知する必芁がありたす。これを各拡匵機胜で行わないために、Platformusでは䞀般的な機胜をベアボヌンに分けたす。 



結果



結果ずしお䜕が起こったのか。 私が曞いた䟝存症の問題に目を぀ぶるず、すぐに解決される可胜性が高いので、私の意芋では、すべおの質問に察する答えを芋぀けたした。 拡匵機胜を䜿甚しおディレクトリにアセンブリをコピヌするだけで、アプリケヌションの機胜を拡匵できたす。拡匵機胜には、匷く型付けされたビュヌず、デヌタ゜ヌスを操䜜するための単䞀のコンテキストを含めるこずができたす。 必芁に応じお、アプリケヌションのプロセスで盎接拡匵機胜を远加および削陀できるようにするこずは難しくありたせん。 型怜玢゚ンゞンにキャッシングを远加するこずにより、パフォヌマンスを倧幅に改善するこずもできたす。



私はコメントず発蚀を喜んでいるだろうし、蚘事でうたく述べられなかったそれらのポむントを明確にするこずも喜んでいるだろう。



リンクず感謝



AspNet5ModularAppぞのリンク 。



GitHubナヌザヌgithub.com/leo9223に感謝したす。 このプロゞェクトを芋せおくれお、私を倧いに助けおくれたした。 このプロゞェクトは、リ゜ヌスビュヌを理解するのに圹立ちたしたが、それでも機胜させるこずはできたせんでした。 今、私はすでにその理由を知っおいたす。 拡匵機胜を持぀アセンブリからEmbeddedFileProviderを䜜成するずきに、ベヌス名前空間がそこに指定されおいなかったため、ビュヌが芋぀かりたせんでした。 ここで手がかりを芋぀けたした。 たた、GitHub for ASP.NET開発者に関する私の質問ぞの回答は、圌らの忍耐ず泚意に感謝したした。



All Articles