ASP.Net vNext、Visual Studio 14　入門

訳者注:この記事は2014年7月28日に投稿された記事「Getting Started with ASP.Net vNext and Visual Studio 14(http://www.asp.net/vnext/overview/aspnet-vnext/getting-started-with-aspnet-vnext-and-visual-studio )」の翻訳です。
訳者が学習のために行っている未熟な翻訳故に、Google翻訳のほうがマシかもしれません。

**また、かなり意訳が多くなっており時には間違った訳があるかもしれません。**

---

モダンなクラウドのアプリを.Netの細分化されたコンポーネント群によって構成できるように、次のバージョンのASP.Net(通称ASP.Net vNext)は1から再設計されました。
ASP.Net vNextのアプリケーションを作成するのにVisual Studioを使わなければならないということはありません。Visual Studioがない環境でも開発及び実行することが可能です。しかし、Visual Studioは最高の開発環境であり、このチュートリアルはこの環境の紹介でもあります。

#ASP.Net vNextの紹介

ASP.Net vNextの特徴は以下のようなものです。
## 1から構築されました
* MVC,Web API,Web Pagesは一つのフレームワークであるMVC 6に統合されました。新しいこのフレームワークは、ルーティング、アクション選択、フィルター、モデルバインディングなどの共通の抽象化セットを利用します。
* 依存性注入(DI)はフレームワークに組み込まれています。好きなIoCコンテナを依存性の登録のために用いてください。
* vNextはホストが何であるか感知しません。IISでもカスタムプロセスにおける自己ホストであってもvNextアプリケーションをホストすることができます。(Web API2とSignalR 2は既に自己ホストをサポートしていました。vNextは同様の特性をMVCにも提供します。)
* vNextはオープンソースかつクロスプラットフォームです。

## 小さく、早く
* MVC6はSystem.Web.dllに依存していません。この結果として小さいフレームワークになり、起動が高速化され少ないメモリ消費に抑えられます。
* vNextアプリケーションはクラウドに最適化されたランタイムと.Net Frameworkのサブセットの両方を使うことが可能です。この.Net Frameworkのサブセットは、フレームワーク全体で200MBであるのに対して11MBしかなく、Nugetのパッケージのコレクションとして構成されています。
* クラウドに最適漁れたフレームワークはNuGetのパッケージであるため、アプリケーションは実際に必要なパッケージのみを含めればよくなります。不必要なメモリ、ディスクスペース、ロード時間を浪費する必要はありません。
* パッケージごとに独立しているため、Microsoftは早いサイクルで更新をすることができます。
* 

## 真のSide-By-Side開発
* 違うバージョンのフレームワークを用いて同じサーバーでSide-By-Sideでアプリケーションを実行できます。
* サーバーのフレームワークの変更からアプリケーションを隔離することができます。
* 自分自身のスケジュールに合わせてそれぞれのアプリケーションのフレームワークのアップデートを行えます。
* 実際に製品としてデプロイする際に、製品サーバーと開発マシンとのフレームワークのパッチレベルが合致しないことによるエラーが起きません。

## 新しい開発のエクスペリエンス

vNextは動的にコードをコンパイルする際、[Roslynコンパイラ(英)](http://msdn.microsoft.com/en-us/library/roslyn.aspx)を用います。
* コードを編集し、ブラウザをリフレッシュすることにより、プロジェクトをリビルドすることなく変更を見ることが可能です。
* 流線型の開発プロセスと異なり、動的なコードのコンパイルによって今までは不可能であった開発手法(例えばVisual Studio Online ("Monaco")を用いてサーバー上でコードを編集する。)を可能にします。
* 自分自身で好きなエディタとツールを選ぶことが可能です。

ASP.Net vNextは1から書き直されています。殆どのvNextのコードは同じように見えても、vNextは後方互換性を既存のアプリケーションに対して持ちません。
しかし、現在のフレームワーク(Web Forms5,Web API2,Web Pages 3,SignalR 2,Entity Framework6)はVisual Studioで引き続き利用可能であり、ASP .Net vNextでフルサポートされるでしょう。

# 対象読者
このチュートリアルはVisual StudioでASP.NetのWebプロジェクトを用いたことがある人を仮定しています。とくにvNextとVisual Studio "14" CTP のvNextプロジェクトのための新機能にフォーカスを当てていきます。

もし、ASP.Net Web FormsやWeb Pagesを使ったことはあるが、MVCはない場合、[Introduction to MVC](http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started)を先に見ておくと理解に役立つでしょう。

# 前提条件
このチュートリアルはVisual Studio "14" CTPを用います。
>Visual Studio "14" CTPはVM,VHDもしくは初期状態のコンピューターにインストールすることが推薦されます。Visual Studio 2013におけるSide-by-Sideの特徴に問題があることが知られています。[Visual Studio "14" CTPについて学ぶ(英)](http://go.microsoft.com/fwlink/?LinkId=400496)

また、vNextアプリケーションをAzureにデプロイするセッションではAzureのサブスクリプションを必要とします。もし、Azureアカウントを持っていなくてMSDNサブスクリプションを持っていたとしたら、MSDNサブスクリプションによる特典を有効化することができます。もしくは、少しの時間であれば、無償トライアルアカウントを作ることも可能です。

##空のvNextプロジェクトを作成する。
最低限の必要なファイルを以てvNext webプロジェクトを作成し、それらのファイルを見てみましょう。それからMVCコントローラーとビューを追加し、その後クラスライブラリをどのように追加、参照するか見ていきます。

1. Visual Studio "14" CTPをスタートします。
2. **Start Page**で、**New Project**、そして**New Project**ダイアログにおいて、C#/Webテンプレートを選びます。
3. **ASP.Net vNext Empty Web Application**テンプレートを選択し、Hello Worldプロジェクトと名付けOKをクリックします。
![画像](http://i2.asp.net/media/49564/newproj.png?cdn_id=2014-07-01-001)
**Solution Explorer**でvNext webプロジェクトで必要となる2つのファイルを見ることができます。(Project.jsonとStartup.csです。)
![画像](http://i2.asp.net/media/49571/se.png?cdn_id=2014-07-01-001)

### project.json
このproject.jsonはプロジェクトの依存関係のリストと、ビルドの出力の設定を含んでいます。また、コマンドのリストも含んでいます。

#### 依存関係
依存関係はNugetパッケージかほかのプロジェクトを指します。空のvNext Webプロジェクトでは、IISでアプリケーションを走らせるためのMicrosoft.AspNet.Server.IIS NuGetパッケージのみを依存として持ちます。

```json:project.json
{
    "dependencies": {
        "Microsoft.AspNet.Server.IIS" : "1.0.0-alpha2"
    }
}
```

(いつ、チュートリアルをするかによって、もしかしたら違うバージョン番号かもしれません。)


NuGetパッケージの参照のために、Visual Studioは非同期的に、プロジェクトがロードされた際に欠けているパッケージを復元します。もしかしたら、HelloWorldプロジェクトがロードされた直後に気が付いたかもしれませんが、**Output**ウィンドウを見れば、Microsoft.AspNet.Server.IISと数十の個のパッケージが依存するパッケージを復元するのに幾ばくかのの時間をとられたことに気が付くことでしょう。
![画像](http://i2.asp.net/media/49567/pkgload.png?cdn_id=2014-07-01-001)

#### ビルド出力設定

Project.jsonはビルドの出力オプションの設定もします。


```json:project.json
{
    "configurations": {
        "net45": { },
        "k10": { }
    }
}
```

これらの設定はVisual Studioの**Property Pages**ウィンドウ内のActive Target Frameworkの設定と同期しています。ソリューションエクスプローラーでプロジェクトを右クリックして**Properties**を選択すればこのウィンドウを見ることができます。
![画像](http://i1.asp.net/media/49588/ppties2.png?cdn_id=2014-07-01-001)
**Active Target Framework**を.Net 4.5にセットした状態で、**Solution Explorer**で**Reference**ノードを見てみます。
![画像](http://i3.asp.net/media/49589/ref45.png?cdn_id=2014-07-01-001)

Microsoft.AspNet.Server.IISと他のNuGetパッケージは**.Net Framework 4.5**ノードの下に見えます。Microsoft.AspNet.Server.IISノードを開けば、参照されているNuGetパッケージをひとつに扱えるように結合されたdllを見ることができます。これにより依存関係を隠すことができ、参照リストをより扱いやすくすることが可能になります。
プロジェクトのプロパティのページに戻り、**Active Target Framework**うぃ**.Net Core Framework 4.5**にして**Solution Explorer**をまた見てください。
Visual Studioはプロジェクトの参照をクラウド用のフレームワークのサブセット上で動くアプリケーション用にプロジェクトの参照を変更します。
![画像](http://i3.asp.net/media/49590/refcore.png?cdn_id=2014-07-01-001)

#### コマンド
project.jsonはコマンドラインからアプリケーションを動かすのを容易にするためにコマンドを含むことができます。例えば例として、

```json:project.json
{
    "commands": {
        /* Change the port number when you are self hosting this application*/
        "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
    }
}
```


このチュートリアルはどうやってvNextアプリケーションをコマンドラインから走らせるかについては言及しません。もしこのことを知りたいなら、[GitHub上のプロジェクトのウィキ](https://github.com/aspnet/Home)をご覧ください。

### Startup.cs
デフォルトでは、vNextのホスティング環境はStartupと名付けられたスタートアップのためのクラスを探すとされています。このクラスはIBuilder型のパラメータを受け取るConfigureメソッドを持ち、HTTPパイプラインの設定をここで行わなければなりません。
空のプロジェクトでは、何もないConfigureメソッドを生成します。

```csharp:Startup.cs
using System;
using Microsoft.AspNet.Builder;

namespace HelloWorld
{
    public class Startup
    {
        public void Configure(IBuilder app)
        {
        }
    }
}
```

このチュートリアルの次のセッションでは、ASP .Net MVC の機能をプロジェクトに追加する際にConfigureメソッドにコードを付けたします。


## コントローラーとビューを追加する
HTTPパイプラインをMVCで有効にするために、NuGetパッケージを追加し、Startupクラスを編集します。
1. project.jsonでMicrosoft.AspNet.Server.IISの行の最後にコンマを追加して、MVCパッケージを以下のように追加します。コピペよりも打って、まだ変更を保存しないでください。

```json:project.json
{
    "dependencies": {
        "Microsoft.AspNet.Server.IIS": "1.0-alpha2",
        "Microsoft.AspNet.Mvc": "6.0-alpha2"
    }
}
```

参照を追加する際にIntelliSenseが働くのに気が付くと思います。
![画像](http://i1.asp.net/media/49561/intellisense.png?cdn_id=2014-07-01-001)

このIntelliSenseのリストはデフォルトのNuGetパッケージソースと他のこのプロジェクトの兄弟階層にあるフォルダから取得されます。

このコードはコロンの後にロードすべきパッケージのバージョンを指定します。正確なバージョン("6.0-alpha2")等を指定することができ、空白文字列によって最新版を指定するか、ワイルドカードによって指定することができます。("6.0-alpha*")等。
2. **Output**ウィンドウを見える状態のままにして、変更を保存してください。
Visual Studioがproject.jsonの変更を見ていることに気が付くと思います、そして自動的にパッケージを復元して追加します。(実際のバージョンはこのスクリーンショットと異なるかもしれません。)
![画像](http://i2.asp.net/media/49568/pkgrestore.png?cdn_id=2014-07-01-001)
Visual Studioはproject.jsonから参照を消してもパッケージを消すことはしません。
しかし、パッケージフォルダはソース管理に一般的にいれないので、次にプロジェクトがソース管理から取得されたときには削除された依存関係は取得されません。

3. Startupクラスを編集します。

```csharp:Startup.cs
using System;
using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;

namespace HelloWorld
{
    public class Startup
    {
        public void Configure(IBuilder app)
        {
            app.UseServices(services =>
            {
                services.AddMvc();
            });

            app.UseMvc();
        }
    }
}
```

AddMvcメソッドはMVCフレームワークサービスをDIシステムに追加します。UseMvcメソッドはルートのようなデフォルトの設定を追加します。

1. コントローラーのフォルダを作成してください、**MVC Controller Class**テンプレートを用いてHomeController.csを作成してください。
![画像](http://i1.asp.net/media/49585/newcontroller2.png?cdn_id=2014-07-01-001)
2. ビューのフォルダを作成します。
3. ビューのフォルダでHomeと名付けられたサブフォルダを作成します。
4. Homeフォルダの中でIndex.cshtmlと名付けられたビューのファイルを　**MVC 5 View Page(Razor)**テンプレートを用いて作成します。
![画像](http://i3.asp.net/media/49587/newview2.png?cdn_id=2014-07-01-001)
5.Index.cshtml内のテンプレートコードを以下のように変更します。

>The current time is : @System.DateTime.Now.ToString()


6.プロジェクトを走らせます。
ブラウザは、日時をIndex.cshtml内に表示します。標準ではIIS Expressによりアプリケーションはホストされます。

![画像](http://i1.asp.net/media/49556/datetime.png?cdn_id=2014-07-01-001)

## vNext プロジェクトをクラスライブラリとともに作成する。

このセクションでは、**ASP.Net vNext Web Application**テンプレートを用いて新しいプロジェクトを作り、**ASP.Net vNext Empty Web Application**と比べて何が追加されたのかを見ていきます。vNextの設定の例を見ることができるでしょう、またwebProjectから参照するためのライブラリプロジェクトも追加します。

1. **File**メニューをクリックして**New Project**を選択し、**New Project**ダイアログでC#/Webテンプレートを選びます。
2. **ASP.Net vNext Web Application**テンプレートを選び、HelloWorld2と名付けOKを押します。
![画像](http://i1.asp.net/media/49586/newproj2.png?cdn_id=2014-07-01-001)
今までに見たproject.jsonやStartup.csに加えて、このプロジェクトはシンプルなMVCアプリケーションが必要とするファイル(CSS,Script,Homeコントローラとビュー)を含んでいます。またAccountコントローラーとびゅ^も含んでおり、ユーザーのログインをASP.Net Identityを用いて行うことが可能です。
![画像](http://i2.asp.net/media/49591/sehw22.png?cdn_id=2014-07-01-001)
**Solution Explorer**の**Reference**ノードを見てください。**Solution Explorer**は参照をまとめて、リストが長くなりすぎないようにしてくれています。例えば、MVCパッケージはMicrosoft.AspNet.Mvcノードの下に現れます。

![画像](http://i3.asp.net/media/49596/mvcref.png?cdn_id=2014-07-01-001)

### vNext設定
このテンプレートはデータベース接続文字列のようなアプリケーション設定を保存するためのファイルconfig.jsonを生成します。

```json:config.json

{
    "Data": {
        "DefaultConnection": { 
            "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnetvnext-HelloWorld2-f0652fd2-febf-488d-955b-b4c590e536f1;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
    }
}
```
vNextアプリケーションではWeb.configファイルを用いることができます、しかしほかにも方法があります。
例えば、NuGetパッケージの.iniファイルや.jsonファイル用の設定プロバイダをインストールする方法です。このテンプレートはMicrosoft.Framework.ConfigurationModel.Jsonを用いるとともにconfig.jsonを生成しています。Startupクラスは以下のようなコードを用いてconfig.jsonかと環境変数から設定を取得できるようにしています。

```csharp:Startup.cs
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();
```


Configurationクラスは、設定に関する他のメソッドも提供します。例えばGetメソッドは設定を取得する際に用います。例えば以下のようなコードで前述のデータベース接続文字列を取得することができます。

```csharp:Startup.cs
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
string connString = configuration.Get("Data:DefaultConnection:ConnectionString");
```

## クラスライブラリプロジェクトを追加する

1. ソリューションに**ASP.Net vNext Class Library**プロジェクトを追加します。名前は標準の"ClassLibrary1"のままにしておきます。(**Windows Desktop**ノードの下にあるクラスライブラリテンプレートではないので注意してください。vNextを用いるためには**Web**ノードの下にあるクラスライブラリテンプレートを用います。)


![画像](http://i1.asp.net/media/49562/newcl.png?cdn_id=2014-07-01-001)

2.HelloWorld2プロジェクトでproject.jsonを開いて、プロジェクトを参照に追加します。
コピペすることなくタイピングをすれば、選択できるオプションとしてClassLibrary1が出現するはずです。

```json:project.json
{
    "dependencies": {
        "EntityFramework.SqlServer": "7.0.0-alpha2",
        "Microsoft.AspNet.Mvc": "6.0.0-alpha2",
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-alpha2",
        "Microsoft.AspNet.Identity.Authentication": "3.0.0-alpha2",
        "Microsoft.AspNet.Security.Cookies": "1.0.0-alpha2",
        "Microsoft.AspNet.Server.IIS": "1.0.0-alpha2",
        "Microsoft.AspNet.Server.WebListener": "1.0.0-alpha2",
        "Microsoft.AspNet.StaticFiles": "1.0.0-alpha2",
        "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-alpha2",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0-alpha2",
        "Classlibrary1": ""
    },
```

ファイルを保存すると、**Solution Explorer**の**Reference**ノードに、クラスライブラリプロジェクトが出現し、プロジェクトのプロパティウィンドウにProjectとでます。
![画像](http://i1.asp.net/media/49598/projref.png?cdn_id=2014-07-01-001)

3. ClassLibrary1プロジェクトで、Class1.csを開いて、以下のようにコードを書きます。

```csharp:Class1.cs
public class Class1
{
    public Class1()
    {

    }
    public static string GetMessage()
    {
        return "Hello World from ClassLibrary1!";
    }
}
```

4.HelloWorld2プロジェクト内で、Controllers/HomeController.csを開き、クラスライブラリのメソッドを呼びます。

```csharp:Controllers\HomeController.cs
public IActionResult About()
{
    ViewBag.Message = Classlibrary1.Class1.GetMessage();

    return View();
}
```

5. CTRL+F5でプロジェクトを走らせてください。(Debugモードで走らせないでください)
ブラウザでは以下のようなページを見ることができるでしょう。
![画像](http://i1.asp.net/media/49595/helloworld23.png?cdn_id=2014-07-01-001)

6. Aboutページを開けばHello Worldメッセージを見ることが可能です。
![画像](http://i1.asp.net/media/49551/about.png?cdn_id=2014-07-01-001)

7. ブラウザを開いたままで、Class1.csのメッセージを”New message from ClassLibrary1”に書き換えてください。
8. ファイルを保存して、プロジェクトはリビルドしないでください。
9. ブラウザをリフレッシュします。

ブラウザでは変更を見ることができます。プロジェクトをリビルドすることなく、このコードファイルが再コンパイルされたのです。

(もし、ブラウザでこの変更が見られないときは、F5ではなくCTRL+F5を押して実行したか見てみてください。動的再コンパイルは、プロセスの再スタートによって行われます、これはVisual Studioがデバッグモードであるときにはできないのです。)

![画像](http://i2.asp.net/media/49552/about2.png?cdn_id=2014-07-01-001)

binフォルダーを見れば、プロジェクトのdllはどこにもないことに気が付きます。ソースコードは動的にコンパイルされメモリに格納されたのです。


以下そのうち翻訳するかもしれません。