まず覚えておきたいのは、「ASP.NET 5とASP.NET 4.6」には基本的に互換性がないという点だ。ASP.NET 4.6は従来のASP.NETの後継であり、プロジェクト管理の方法も従来の形式を踏襲している。一方、ASP.NET 5は「次世代のASP.NET」(ASP.NET vNext)であり、これまでに進化と肥大を続けてきたASP.NETを一から作り直したものだ。これまでのASP.NETが依存していたSystem.Webアセンブリへの依存を断ち切っているのも、ASP.NET 5の大きな特徴である。
これまでに見てきた通り、ASP.NET 5はDNX上で動作する。つまり、Windows/OS X/LinuxでASP.NET 5は動作するということだ(上の図ではDNXは省略)。これに対して、ASP.NET 4.6は.NET Framework 4.6をプラットフォームとする。そのため、ASP.NET 4.6が動作するのはWindows環境だけとなる(実際のところは、monoでASP.NET 4.6がどの程度サポートされるかによるだろう。なお、monoにおけるASP.NETのサポートについては「Compatibility」ページを参照されたい)。
上記の点も含めたASP.NET 5の特徴としては、以下のことが挙げられる。
ここで覚えておきたいのは「ミドルウエア」という用語だ。ASP.NET 5では、Webサーバーが受け取ったリクエストは「リクエストパイプライン」を通過して、最終的なアプリへと届けられる。このパイプラインを通過する過程で、ユーザー認証やエラー発生時のフォールバックページの設定などを行える。そして、これらの処理を行うために使うコンポーネントのことを「ミドルウエア」と呼ぶ(実際には、ASP.NET MVC 6のようなフレームワークについても、それを使うには、ミドルウエアと同様な設定が必要になる。以下に例を示す。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
// Configure the HTTP request pipeline.
…… 省略 ……
// Add static files to the request pipeline.
app.UseStaticFiles();
// Add cookie-based authentication to the request pipeline.
app.UseIdentity();
…… 省略 ……
// Add MVC to the request pipeline.
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
}
上に示したのは、Visual Studio 2015 RC([新しい ASP.NET プロジェクト]で[ASP.NET 5 プレビューテンプレート]グループのテンプレート)で作成したASP.NET MVC 6アプリのStartupクラスのConfigureメソッドだ*2。ミドルウエアの設定はConfigureメソッドで行い、使用するものを「app.Use〜」のように「Use〜」拡張メソッドを使って追加していく。ここでは、静的ファイルを扱うためのミドルウエア(UseStaticFilesメソッド)、クッキーベースの認証ミドルウエア(UseIdentityメソッド)、ASP.NET MVC 6(UseMvcメソッド)をリクエストパイプラインに追加していることが分かる。
*2 ASP.NET 5アプリではStartupクラスのConfigureメソッドがそのエントリポイントとなっている。
もう一つ覚えておきたいのは「ASP.NET 5ではIoCが全面的に採用されている」点だ。ASP.NET 5ではアプリ中で使用する各種の「サービス」が、IoCを使用してアプリの各所で注入されるようになっている。これも以下に例を示す。アプリで使用する各種のサービスはStartupクラスのConfigureServicesメソッドで行う。
public void ConfigureServices(IServiceCollection services)
{
…… 省略 ……
// Add EF services to the services container.
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
// Add Identity services to the services container.
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
…… 省略 ……
// Add MVC services to the services container.
services.AddMvc();
…… 省略 ……
}
このコードでは、アプリが使用するサービスとしてEntity Framework、Identityが依存するサービス、同じくASP.NET MVC 6が依存するサービスがサービスコンテナーに追加されている。自分でサービスを作成して、これをサービスコンテナーに追加し、コードの中からそのサービスを利用することも可能だ。
public interface IMyService
{
string Message { get; set; }
}
public class MyService : IMyService
{
public MyService()
{
Message = "hello from insider.net";
}
public string Message { get; set; }
}
例えば、上のようなサービスを作成し、これをConfigureServicesメソッドでサービスコンテナーに追加する(これをサービスというかどうかは別として)。
public void ConfigureServices(IServiceCollection services)
{
…… 省略 ……
services.AddInstance<IMyService>(
new MyService() { Message = "Hello from my service" });
}
このようにして作成したサービスは、それを使用する箇所で自動的にコンテナーからインジェクションされる。
public class HomeController : Controller
{
IMyService _mysvc;
public HomeController(IMyService mysvc)
{
_mysvc = mysvc;
}
public IActionResult Index()
{
ViewBag.Message = _mysvc.Message;
return View();
}
…… 省略 ……
}
ミドルウエアの概念、サービスとIoCの活用はASP.NET 5の大きな特徴なので、ぜひ覚えておきたい。
インターネットで「ASP.NET 5」などを検索した際に、現在でもよく見られるのは「K」や「KRE」などの「K」で始まる以前の用語だろう。「K」は「Katana Project」と呼ばれる、「OWIN」(Open Web Interface for .NET)のマイクロソフト実装を意味するといわれている。
OWINは、Webサーバーとその上で動作するWebアプリを疎結合するためのインターフェース仕様であり、ASP.NET 5の礎となっている。ただし、ASP.NET 5はOWINをそのままの形で実装しているわけではない。「WebサーバーからWebアプリまでの間をホスト/サーバー/ミドルウエア/アプリといった階層に分離し、それらを疎結合することでWebアプリ開発をシンプル/モジュール的に行えるようにしよう」という思想はどちらも同じだが、実装は異なるものになっている(だが、ASP.NET 5ではOWINに則ったミドルウエアを動作させるための仕組みも用意されている。GitHubで公開されているMicrosoft.AspNet.OwinアセンブリのOwinExtensionsクラスを参照)。
本稿では、駆け足でASP.NET 5とその実行環境であるDNXに関連する用語を見てきた。DNX/dnvmコマンド/dnuコマンド/dnxコマンド/サービス/ミドルウエアなどが分かれば、ASP.NET 5についての理解も進むはずだ。
Copyright© Digital Advantage Corp. All Rights Reserved.