Category Archives: ASP.NET vNext

ASP.NET vNext で別ソリューションのクラスライブラリを参照する

※ Visual Studio 14 CTP 4 時点での情報です。

ASP.NET vNext では、Web アプリケーションと同一のソリューションに追加したクラスライブラリであれば、project.json にインテリセンスを使って依存関係を追加することができます。別ソリューションのクラスライブラリを参照する場合に、便利な機能が Visual Studio に追加されていました。

クラスライブラリ

Visual Studio のプロジェクトテンプレートから、「ASP.NET vNext Class Library」を選択して新規作成します。プロジェクトのプロパティを見ると、「Produce outputs during build」という項目があります。

nuget

この設定を「yes」に変更することで、プロジェクトをビルドすると、bin の debug フォルダに NuGet パッケージが作成されます。

nuget02

NuGet パッケージを取得するパスを追加

Visual Studio の Option メニューから、NuGet パッケージを取得するパスを設定します。

nuget03

先ほど作成した NuGet パッケージを MyPackage フォルダにコピーします。

Web アプリケーション

Visual Studio のプロジェクトテンプレートから、「ASP.NET vNext Web Application」を選択して新規作成します。NuGet パッケージの管理画面で、別ソリューションのクラスライブラリをインストールすることができます。

nuget04

作成された NuGet パッケージの nuspec ファイルを見ると、id、title、authors などにプロジェクト名の「ClassLibrary1」が設定されていました。

nuget05

この nuspec ファイルを変更して、ClassLibrary1 プロジェクトの直下に配置してビルドしましたが、残念ながら変更した結果は反映されませんでした。

まとめ

ASP.NET vNext では、NuGet をギャラリーで公開されているライブラリの管理だけでなく、社内の開発環境での利用を推奨するような改善が行われており、Visual Studio を利用した開発に欠かせないツールとなっています。クラスライブラリのバージョンや依存関係の面倒な管理を NuGet に任せることで、開発業務の生産性を大きく向上できそうです。

ASP.NET vNext で Web API を試してみた

Visual Studio 14 CTP がリリースされたので、ASP.NET vNext で Web API を試してみました。

MVC と Web API が MVC 6 にマージされたので、Areas を利用して Web API のコントローラーをルーティングしてみます。GET のリクエストで、Person オブジェクトの JSON データを返すサンプルを作ります。

  • GET api/person/
  • GET api/staff/person/

以下のサイトを参考にしました。

MVC の依存関係を追加する

Visual Studio で新規プロジェクトを「ASP.NET vNext Empty Web Application」で作成します。project.json ファイルに、MVC の参照を追加します。インテリセンスが効くので、簡単に記述できます。

{
    "dependencies": {
        "Helios" : "0.1-alpha-build-0585",
        "Microsoft.AspNet.Mvc": "0.1-alpha-build-1268"
    },
    "configurations" : {
        "net45" : { },
        "k10" : { }
    }
}

URL のルーティングを実装する

Startup クラスの Configure メソッドに、デフォルトと Area の 2 つの URL のルーティングを実装します。

using System;
using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
using Microsoft.AspNet.Routing;

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

            app.UseMvc(routes =>
            {
                routes.MapRoute("AreasApiRoute", "api/{area}/{controller}/{id?}");
                routes.MapRoute("ApiRoute", "api/{controller}/{id?}");
            });
        }
    }
}

モデルを実装する

Web API のレスポンスで返す Person クラスを実装します。

using System;

namespace WebApplication5
{
    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

コントローラーを実装する

異なる名前空間の PersonController クラスを実装します。2 つめのコントローラークラスに、[Area(“Staff”)] の属性を指定するところがポイントです。

using Microsoft.AspNet.Mvc;

namespace WebApplication5.Controllers
{
    public class PersonController : Controller
    {
        public ActionResult Get()
        {
            var person = new Person { ID = 16, Name = "Aaron Ramsey" };
            return Json(person);
        }
    }
}

namespace WebApplication5.Staff.Controllers
{
    [Area("Staff")]
    public class PersonController : Controller
    {
        public ActionResult Get()
        {
            var person = new Person { ID = 99, Name = "Arsène Wenger" };
            return Json(person);
        }
    }
}

実行結果を確認すると、GET api/person/ は「Aaron Ramsey」、GET api/staff/person/ は「Arsène Wenger」のレスポンスが JSON で返ります。

まとめ

以前の記事に投稿したように、Attribute Routing を使っても、異なる名前空間の同名のコントローラーを定義できませんでした。MVCではできるのに・・・

今回、MVC と Web API がマージされたことで、MVC の Areas が使えるようになり、シンプルに実装できます。ASP.NET vNext は、もっと大きな話であり、これ以外にもいろいろと進化があって面白そうなので、少しずつ勉強していきたいと思います。