ASP.NET Core RC2:モジュール性の組み込みサポート(アプリケーションパーツ)

歴史的にASP.NETでのモジュラーアプリケーションの開発に没頭していたのは、ASP.NET Core RC2が登場したときに最初にしたことです。ExtCoreモジュラーフレームワークをそこに転送しようとしました。 ここで、新しいバージョンですべてが変更され、RC1からの古いアプローチが機能しなくなったことが判明しましたが、お話ししたい新しい興味深い機会があります。



つまり、RC2でのモジュラーアプリケーションの開発は非常に単純化されています。 新しい「アプリケーションパーツ」機能のおかげで、大きなプロジェクトをいくつかの小さなプロジェクトに簡単に分割して、自由に組み立てることができます。 これは、コントローラー、ビュー、およびその他のリソースのセットを既に分離しているエリア(エリア)で作業する場合に特に便利です。各エリアは個別のプロジェクトで選択できるようになりました。 私が理解している限り(特に、 aspnet / Mvc#4089から )、実装は、大規模プロジェクトを小規模プロジェクトに、MVCの一部のみに分割することに特に焦点を当てています。 残りはまだ自分で書く必要があります。





実装



たとえば、小さなアプリケーションを作成して、すべてがどのように機能するかを見てみましょう(すでにここに 、必要なものをすべてインストールしていることが前提です)。 したがって、プロジェクトを作成します。







次のステップで「Webアプリケーション」を選択して、Visual Studioがテスト用のアプリケーションを作成できるようにします。







以上です。 次に、新しいアプリケーションを起動します。







プロジェクトの構造や、構造とRC1で慣れているものとの違いについては触れません。 必要に応じて、これを見ることができます。



ソリューションに別のプロジェクト、今度はクラスライブラリを追加します。







アセンブリからコントローラーとビューを確認するため、project.jsonファイルにMVCへのリンクを追加します。 また、このプロジェクトのビューをリソースとしてアセンブリに追加する必要があります。 これは、project.jsonファイルのbuildOptionsセクションの適切な設定を使用して行われます。 その結果、次のファイルが取得されます。



{ "buildOptions": { "embed": [ "Views/**" ] }, "dependencies": { "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final", "NETStandard.Library": "1.5.0-rc2-24027" }, "frameworks": { "netstandard1.5": { "imports": "dnxcore50" } }, "version": "1.0.0-*" }
      
      







ここで、プロジェクトに単一のメソッドで新しいコントローラーを作成します(一貫性を保つために、コントローラークラスのファイルをControllersフォルダーに配置することが望ましいですが、これは必須ではありません)。



 public class ModuleAController : Controller { public ActionResult Index() { return this.View(); } }
      
      







ここで、\ Views \ ModuleAフォルダーに、好きなコンテンツを含むIndex.cshtmlビューを作成します。



プロジェクトの準備ができました。 集めましょう。 binフォルダーはプロジェクトフォルダーに表示され(以前のバージョンのASP.NETと同様)、その中にアセンブリが表示されます。 それについては、メインアプリケーションに話をするだけです。



アプリケーションプロジェクトのStartupクラスを開き、ConfigureServicesメソッドに進みましょう。 最初に、コントローラーとビューを使用してアセンブリを読み込みます。



 Assembly assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(@"   ");
      
      







次に、MVCのアプリケーションの一部として、ロードされたアセンブリを追加します。



 services.AddMvc().AddApplicationPart(assembly);
      
      







ほぼすべて。 ここでアプリケーションを起動して/ moduleaに移動すると、例外が発生します:InvalidOperationException:ビュー 'Index'が見つかりませんでした。 アセンブリ内で表現を探す必要があることをMVCに説明するために、Razor設定に適切なファイルプロバイダーを追加します。 前のコード行を次のように変更します。



 services.AddMvc().AddApplicationPart(assembly).AddRazorOptions( o => { o.FileProviders.Add(new EmbeddedFileProvider(assembly, assembly.GetName().Name)); } );
      
      







2部構成のアプリケーションの準備ができました。 それを実行し、アドレス/モジュールに移動します:







とてもかっこいい。 RC1に戻ると、さらにコードが必要になります。 ただし、これは、厳密に型指定された表現を使用するまでは十分です。 プロジェクトにビューモデルクラスを追加し、それをビューのモデルとして指定すると、実行時に例外が発生します。タイプまたは名前空間名「ModuleA」は、名前空間「AspNetCoreApplicationParts」に存在しません。 これは、Razorがビューをコンパイルするときに型を探すアセンブリセットの一部ではないという事実によるものです。 幸いなことに、これを修正するかなり簡単な方法があります。 さらに、アプリケーションの一部として追加されたアセンブリは自動的にRazorコンパイルに参加するため、近い将来、この手順は必要なくなります。



前の手順で使用したAddRazorOptions関数の呼び出しを次のように変更します。



 .AddRazorOptions( o => { o.FileProviders.Add(new EmbeddedFileProvider(assembly, assembly.GetName().Name)); Action<RoslynCompilationContext> previous = o.CompilationCallback; o.CompilationCallback = c => { if (previous != null) { previous(c); } c.Compilation = c.Compilation.AddReferences(reference); }; } );
      
      







アセンブリを読み込む前に、参照変数をどこかに宣言することは残ります。



 PortableExecutableReference reference = MetadataReference.CreateFromFile(@"   ");
      
      







以上です。 これで、ビューモデルを使用できます。 アプリケーションを実行して/ moduleaに移動します。







ところで、RC1に戻ると、ビューの予備コンパイルを使用でき、実行時にビューのタイプのタイプを解決するのに問題はありません。 残念ながら、RC2では、予備的なコンパイルはサポートされていません(実装の複雑さのため、理解しているとおり)が、将来返される予定です。



結果



おそらく、アプリケーションパーツは、ASP.NETに長い間欠けていたものです。 以前のバージョンで(ASP.NET Coreの前でさえ)同様の結果を達成するために多くの時間を費やしました。 この機能を使い始めるには、この例で十分だと思います。 そして、Gitterでチャットをしてくれた人たちに感謝します。



プロジェクト全体(わずかに簡略化された形式)がGitHubで利用可能です。



All Articles