ASP.NET 5でのコンソールアプリケーション (ASP.NET Advent Calendar 21日目)

この記事はASP.NET Advent Calendar 2014の12/21分記事として作成した物です。

さて、みなさん。Visual Studio 2015 PreviewのWebアプリケーションのプロジェクトテンプレートにコンソールアプリケーション(下図)があるのが気になりませんか?

私はすごく気になります!

SnapCrab_新しいプロジェクト_2014-12-21_19-30-10_No-00

本来、コンソールアプリケーションならWindowsデスクトップ側にあっても良さそうなのに、これは事もあろうにWebアプリケーションの側にあります。

何者かよくわからないのでとりあえずプロジェクト名をHelloWorldにしてプロジェクトをウイザードに作らせます。

作らせると下図のようなソリューション構成となります。

SnapCrab_NoName_2014-12-21_19-30-42_No-00

何か今までと違います。project.jsonとか言うファイルが出来ていたりします。

そして、DBアクセスのコードを書きたいので、PCのGACにあるSystem.Dataのアセンブリを参照したいので、Referencesを右クリックして、参照の追加を選択します。(下図)

SnapCrab_Reference Manager - HelloWorld_2014-12-21_19-31-43_No-00

あれ?おかしいですね。GACにあるはずのアセンブリが一切表示されません、それどころか、その為のタブさえ表示されません。何か違いますね。

ま、既におわかりのこととは思いますが、このWebアプリケーション側で作成されるASP.NET 5コンソールアプリケーションは、ASP.NET 5の仕組みを利用したコンソールアプリケーションで、従来の.NET FrameworkのCLRでない、ASP.NET 5と同様のいわゆるKRuntime上で動作している物だからです。このためGACのようなCLRの持つ機構は使いません(使えない)。つまり、コンソールアプリケーションであっても、ASP.NET 5のWebアプリケーションと同様に、必要なライブラリはNuGetを使ってプロジェクトごとに管理を行う必要があります。

では、データベースアクセスのためにNuGetのパッケージマネージャを使って、Entity Framework 7のSQL Serverプロバイダを追加します。

SnapCrab_HelloWorld_2014-12-21_19-50-26_No-00

上は追加後です。

また、EntityFramework.Commandsも追加しておきます。

GUI上で追加すると、設定を書き換え、NuGetが必要なライブラリをダウンロードします。具体的にはproject.jsonに必要な記述を追加します。

以下はそれぞれ追加後のproject.jsonで、このあたりもWebアプリケーションと何ら変わりません。

{
    "version": "1.0.0-*",
    "dependencies": {
"EntityFramework.SqlServer": "7.0.0.0-beta1",
"EntityFramework.Commands": "7.0.0-beta1"
},
    "commands": { 
        "run" : "run"
    },
    "frameworks" : {
        "aspnet50" : { },
        "aspnetcore50" : { 
            "dependencies": {
                "System.Console": "4.0.0-beta-22231"
            }
        }
    }
}

うまくインデントされていないのpreviewだからでしょう。

とりあえず、SQL Serverにデータを追加して、表示するコンソールアプリを作って見ました。

namespace HelloWorld
{
    using System;

    using Microsoft.Data.Entity;

    public class Program
    {
        public void Main(string[] args)
        {
            var context = new LogContext();
            context.Database.EnsureCreated();

            context.Logs.AddRange(
                new[]
                    {
                        new Log { Time = new DateTime(2014, 12, 21, 0, 0, 0), Description = "Midnight" },
                        new Log { Time = new DateTime(2014, 12, 21, 6, 0, 0), Description = "Morning" },
                        new Log { Time = new DateTime(2014, 12, 21, 12, 0, 0), Description = "Noon" }
                    });
            context.SaveChanges();

            foreach (var log in context.Logs)
            {
                Console.WriteLine("{0}, Time:{1}, Description:{2}", log.Id, log.Time, log.Description);
            }

            Console.ReadLine();
        }
    }

    public class Log
    {
        public int Id { get; set; }

        public DateTime Time { get; set; }

        public string Description { get; set; }
    }

    public class LogContext : DbContext
    {
        public DbSet Logs { get; set; }

        protected override void OnConfiguring(DbContextOptions builder)
        {
            builder.UseSqlServer(@"Server=(localdb)\v11.0;Database=Logs;Trusted_Connection=True;");
        }
    }
}

今までとコードとしては大きく変わったところはありません。12行目でデータベースがなかったときに作成するようにしているだけです。

実行結果は次のようになります。

1, Time:2014/12/21 12:00:00, Description:Noon
2, Time:2014/12/21 6:00:00, Description:Morning
3, Time:2014/12/21 0:00:00, Description:Midnight

とりあえず、普通に動きます。

また、次のようにkコマンドでコンソール上からも動作させられます。

D:\Documents\Visual Studio 2015\Projects\HelloWorld\src\HelloWorld>k run
1, Time:2014/12/21 12:00:00, Description:Noon
2, Time:2014/12/21 6:00:00, Description:Morning
3, Time:2014/12/21 0:00:00, Description:Midnight

ディレクトリ上にexeファイルも無く、Webアプリケーションと同様非常にクリーンです。

さて、クリーンは良いのですが、実行ファイルがなければ標準入力を受けて処理し標準出力に結果を出力するといった、いわゆるコンソールアプリケーションのツールと言ったような物が作れません。Unixway的な通常のコンソールでの用途を考えると、KRuntimeでコンソールアプリケーションを作成する意味がよくわかりません。せっかくツール開発で気軽なクロス開発が出来そうだったのに残念です。

では、この「コンソールアプリケーション」が存在する理由って何でしょう。

1つには当然のことながらIISなどに頼らないセルフホストでWeb Serviceを構築する用途です。

もう一つ考えられるのが、クラウドでのUnixwayの実現、そのツール作成としての用途です。Unixwayとは単機能のツールをコンソール上で標準入出力のパイプで繋いで行き、一つの価値の有るの処理を実現させていくことですが、これが一つのマシンでなく、クラウドとなった場合はどうでしょう。クラウドの標準入出力とはといった場合それはHTTPです。HTTPでデータをクロールして、HTTPとして加工データを公開するのがクラウドのツールです。このようなツールを作って、そのツールをクラウドでホストさせるときに、ASP.NET 5のコンソールアプリケーションが実力を発揮するのかもしれません。

あと、前に紹介したYoemanでもコンソールアプリケーションのひな形は作成できるので、非VS環境の方も試してみてください。

では、明日はDarkCrash3さんです。ハリキッテどうぞ!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください