ASP.NET 5およびMVC 6の主要な変更

読者の皆さん、おはようございます。



この週は、ASP.NETの書籍の出版に聴衆がどれだけ興味を持っているかを明確にするのに役立つ、多少抽象的ではありますが、このような有益な翻訳から始まります。 実践では、Peterの本「 ASP.NETとAJAXを使用したアプリケーション開発 」と「 Microsoft ASP.NET 4を使用したプログラミング 」には大きな需要がなかったことが示されています。 ただし、この投稿の結果に基づいて、ASP.NET 5およびMVC 6でスワイプすることはまだ可能です。



2015年4月30日パッチ



この投稿の第1版では、MicrosoftはASP.NET 5 / MVC 6でVB.NETをサポートする予定はないと書いています。 だから、どうやら、再びVB.NETがケージに!

www.infoq.com/news/2015/04/VB-Core



最後の数週間、ASP.NET 5 / MVC 6のコードサンプルの作成に費やしました。ASP.NET5ベータの現在のバージョンに加えられた変更の深さに驚かされました。 ASP.NET 5は、ASP.NETフレームワーク全体の歴史の中で最も重要な新しいリリースです。フレームワーク全体が書き直されたと言えます。



この記事では、私にとって最も重要と思われるASP.NET 5の10の変更に焦点を当てます。 リストは非常に主観的です。 他の変更について言及したい場合は、コメントで説明してください。



1. OSXおよびLinux上のASP.NET







ASP.NETの歴史で初めて、ASP.NET 5アプリケーションがOSXおよびLinuxで実行できるようになりました。 繰り返しますが、ASP.NET 5アプリケーションはWindows、OSX、Linuxで実行できます。 これにより、以前はこのフレームワークを使用できなかった多くの開発者や設計者にASP.NETが開かれます。

従来のASP.NETの対象者は、大企業で働くプロのプログラマーです。 このような企業のクライアントは、Windowsコンピューターに緊密にチェーンされています。



OSX / Linuxを使用するのが一般的なスタートアップでは、まったく異なる状況が発生します。 スタートアップカンファレンスに参加するたびに、聴衆全員がMacbook Proで作業していることがわかります。 通常、これらの人々はASP.NETを使用しません。



さらに、クライアント側のデザイナーと開発者-少なくとも企業のダンジョンの外で働く人々-もMacbookでの作業が大好きです。 私はjQueryカンファレンスに参加するべきです。MacBookProはどこにでもあります(次の写真はjQueryテーマ別ブログからのものです)。



ASP.NET 5がWindows、OSX、Linuxで動作するようになったため、すべてが変わります。 ASP.NET 5を使用したアプリケーションの構築は、すべての開発者とデザイナーが初めて利用できます。 さらに、Sublime TextやWebStormなど、好みの開発環境で作成できます(Visual Studioは必要ありません)。



OmniSharpプロジェクトを調べて、ASP.NET 5でさまざまなテキストエディターを使用する方法を確認してください。具体的には、Sublime Text、Atom、Emacs、およびBracketsです。

www.omnisharp.net



2.これ以上のWebフォーム



ASP.NET Webフォームが大好きです。 私の人生の中で、Webフォームを使用したアプリケーションのプログラミングに数百時間、さらには数千時間を費やしてきました。 しかし、今が彼らに別れを告げる時です。 ASP.NET 5にはWebフォームがなくなります。



Webフォームを使用するアプリケーションは、.NET 4.6フレームワークをターゲットプラットフォームとして設定することにより、Visual Studio 2015でさらにプログラムできます。 ただし、Webフォームアプリケーションでは、このリストで説明する新しいASP.NET 5の新しい機能を使用することはできません。 歴史的な進歩を傍観したくない場合は、いよいよアプリケーションをWebフォームからASP.NET MVCに書き直します。



3.タグヘルパー



タグヘルパー(ヘルパー)は、おそらくASP.NET MVCアプリケーションで作成したビューに最も強く影響する可能性のあるまさにその機能です。 タグヘルパーは、従来のMVCヘルパーよりも便利な代替手段です。



新しい製品を作成するためのフォームを含む次のMVCビューを検討してください。



@model MyProject.Models.Product @using (Html.BeginForm()) { <div> @Html.LabelFor(m => p.Name, "Name:") @Html.TextBoxFor(m => p.Name) </div> <input type="submit" value="Create" /> }
      
      







上記の例では、Html.BeginForm()Html.LabelFor()およびHtml.TextBoxFor()ヘルパーを使用してフォームを作成します。 これらのヘルパーは、HTMLデザイナーが遭遇することはほとんどありません。

タグヘルパーを使用してまったく同じフォームを作成する方法は次のとおりです。



 @model MyProject.Models.Product @addtaghelper "Microsoft.AspNet.Mvc.TagHelpers" <form asp-controller="Products" asp-action="Create" method="post"> <div> <label asp-for="Name">Name:</label> <input asp-for="Name" /> </div> <input type="submit" value="Save" /> </form>
      
      







注:この更新されたバージョンのフォームには、HTML要素のみが含まれています(少なくとも、一見したように見えます)。 たとえば、フォームにはHtml.TextBoxFor()ヘルパーではなく、INPUT要素があります。 クライアント側のデザイナーはこのページを気に入っているでしょう。 このビューに固有のすべての複雑さは、asp-for属性に関連付けられています。 これらの属性は、ASP.NET MVCサーバー機能で要素を補完するために使用されます。

次の記事では、Damien EdwardsがTag Helpersのみを使用するサイト全体を示しています。

github.com/DamianEdwards/TagHelperStarterWeb



4.プレゼンテーションコンポーネント



サブコントローラーに別れを告げる、長いライブビューコンポーネント!

ASP.NET MVCの以前のバージョンでは、Html.Action()ヘルパーを使用してサブコントローラーを呼び出しました。 広告バナーを複数のビューに一度に表示するとします。 この場合、特定のバナーを返すためのロジックを含むサブコントローラーを作成する必要があり、サブコントローラーはビューからHtml.Action()ヘルパーを呼び出した結果として起動します。

サブコントローラー-Html.Action()ヘルパー-は、MVC 6の現在のベータ版にはありません。代わりに、MVC 6はView Componentsと呼ばれる代替技術を使用します。



時刻に基づいて2つのバナー広告のいずれかを表示するプレゼンテーションコンポーネントを作成する方法は次のとおりです。



 using Microsoft.AspNet.Mvc; using System; namespace Partials.Components { public class BannerAd : ViewComponent { public IViewComponentResult Invoke() { var adText = "Buy more coffee!"; if (DateTime.Now.Hour > 18) { adText = "Buy more warm milk!"; } return View("_Advertisement", adText); } } }
      
      







17:00まで、プレゼンテーションコンポーネントは、広告テキスト「Buy more coffee!」を含む_Advertisementという部分テンプレートを返します。 17.00以降、このテキストは「より温かい牛乳を購入してください!」に変わります。

部分的な_Advertisementテンプレートは次のようになります。



 @model string <div style="border:2px solid green;padding:15px"> @Model </div>
      
      







最後に、MVCビューでBannerAdビューコンポーネントを使用する方法を次に示します。



 @Component.Invoke("BannerAd")
      
      







表現コンポーネントは、サブコントローラーに非常に似ています。 ただし、サブコントローラーは常に奇妙です。 アクションコントローラーとして機能するはずでしたが、実際にはそうではありませんでした。 表現のコンポーネントはより自然に見えます。



5. GruntJS、NPM、およびBowerのサポート







GruntJS(そして最終的にはGulp)がこのフレームワークでサポートされているため、クライアント側の開発者はASP.NET 5を本当に気に入っています。



GruntJSは、JavaScriptやCSSファイルなど、クライアント側のリソースを収集できるタスクマネージャーです。 たとえば、GruntJSを使用して、Visual Studioでの各ビルド中にJavaScriptファイルを連結および削減できます。



想像を絶する数のタスクを解決できる数千のGruntJSプラグインがあります(現在、GruntJSプラグインリポジトリにはそのようなモジュールが4,334個あります)。

gruntjs.com/plugins



たとえば、JavaScript単体テストの実行、JavaScriptコード品質(jshint)の検証、CSSでのLESSおよびSassファイルのコンパイル、JavaScriptでのTypeScriptのコンパイル、画像サイズの縮小のためのプラグインがあります。

GruntJSのサポートを提供するために、Microsoftは2つの新しいパッケージマネージャー(NuGetを除く)をサポートする必要がありました。 まず、GruntJSプラグインはNPMパッケージとして配布されるため、MicrosoftはNPMパッケージのサポートを追加しました。



第二に、多くのクライアントリソース、特にTwitter Bootstrap、jQuery、Polymer、AngularJSがBowerを通じて配布されているため、MicrosoftはBowerのサポートを追加しました。



したがって、NPMのプラグインとBowerのクライアントリソースを使用してGruntJSを実行できます。



6.統合MVCおよびWeb APIコントローラー



ASP.NET MVCの以前のバージョンでは、MVCはWeb APIとは異なりました。 MVCコントローラーは基本クラスSystem.Web.MVC.Controllerを使用し、Web APIコントローラーは基本クラスSystem.Web.Http.ApiControllerを使用しました。



MVC 6には、すべてのMVCコントローラーとWeb APIの基本クラスであるコントローラークラスが1つしかありません。 これは、Microsoft.AspNet.Mvc.Controllerクラスです。



MVC 6コントローラーはIActionResultインターフェイスを返します。 MVCコントローラーとして使用する場合、IActionResultはビューにすることができます。 Web APIコントローラーの場合、IActionResultはデータ(製品のリストなど)である場合があります。 同じコントローラーに、ビューとデータの両方を返すアクションがある場合があります。



MVC 6では、MVCコントローラーとWeb APIコントローラーの両方が同じルートを使用します。 契約ルートまたは属性ベースのルートを使用できます。 プロジェクトのすべてのコントローラーに適用されます。



7. AngularJS



AngularJSは、最も一般的なシングルページアプリケーション(SPA)クライアントフレームワークの1つです。 Visual Studio 2015には、AngularJSモジュール、コントローラー、ディレクティブ、およびファクトリーを作成するためのテンプレートがあります。



ASP.NET 5でGruntJSをサポートするASP.NETは、AngularJSクライアントアプリケーションを構築するための優れたサーバー側フレームワークです。 各ビルド中にすべてのAngularJSファイルを自動的に結合して削減できます。 RESTを使用して、$リソースAngularJSからMVC 6コントローラーと対話できます。



8. ASP.NET依存性注入フレームワーク



ASP.NET 5には、依存性注入とサービスロケーターパターンのサポートが組み込まれています。 したがって、NinjectやAutoFacなどの依存関係を実装するために、サードパーティのフレームワークに依存しなくなりました。

IRepositoryインターフェイスと、このインターフェイスを実装するEFRepositoryクラスを作成したとします。 この場合、次のようにStartup.csクラスのConfigureServices()メソッドを使用して、EFRepositoryクラスをIRepositoryインターフェイスにバインドできます。



 services.AddTransient<IRepository, EFRepository>();
      
      







EFRepositoryとIRepositoryをリンクすることにより、同様のコードを使用してMVCコントローラー(およびその他のクラス)にコンストラクターの依存関係を埋め込むことができます。



 public class ProductsController : Controller { private IRepository _repo; public ProductsController(IRepository repo) { _repo = repo; } }
      
      







上記のコードでは、IRepositoryインターフェイスがProductsControllerのコンストラクターに渡されます。 IRepositoryインターフェイスはEFRepositoryに関連付けられているため、ASP.NETのこの組み込みの依存関係注入フレームワークは、EFRepositoryをProductsControllerに渡します。



さらに、「Service Locator」パターンを使用できます。 HttpContextにアクセスできる場合はいつでも、登録されているサービスにアクセスできます。 たとえば、MVCアクションコントローラーの代わりに次のコードを適用することにより、EFRepositoryを抽出できます。



 var repo = this.Context.ApplicationServices.GetRequiredService<IRepository>();
      
      







9.xUnit.net



さようならVisual Studioユニットテストフレームワーク、Long Live xUnit.net!

ASP.NET MVCの以前のバージョンでは、Visual Studio単体テストフレームワーク(mstestと呼ばれることもあります)がデフォルトでテストに使用されていました。 単体テストを記述するために、属性[TestClass]および[TestMethod]を使用します。



 [TestClass] public class CalculatorTests { [TestMethod] public void TestAddNumbers() { //  var calc = new Calculator(); //  var result = calc.AddNumbers(0, 0); //  Assert.AreEqual(0, result); } }
      
      







ASP.NET 5は、ユニットテストにxUnit.netフレームワークを使用します。 [TestMethod]の代わりに[Fact]属性を使用し、[TestClass]属性がありません:



 public class CalculatorTests { [Fact] public void AddNumbers() { //  var calculator = new Calculator(); //  var result = calculator.AddNumbers(1, 1); //  Assert.Equal(result, 13); } }
      
      







ASP.NET 5ソースコードを操作すると、xUnit.netが広範なASP.NETテストに使用されていることがわかります。 たとえば、MVCリポジトリには、xUnit.netを使用して記述された単体テストがあります。 MVCリポジトリ(およびその単体テスト)は、次の場所にあります。



github.com/aspnet/mvc



ASP.NETは、次の場所にあるxUnit.netブランチを使用します。

github.com/aspnet/xunit



All Articles