つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

Dockerhubのmicrosoft/dotnetに公開されている.NET Coreのイメージのタグの役割を理解する

こちらの記事を読んでいて、.NET CoreのDockerイメージについての説明が載っていたので訳しつつ整理してみます。

blogs.msdn.microsoft.com

Dockerhub

.NET Coreのイメージが管理されているのはmicrosoft/dotnetというリポジトリになります。

hub.docker.com

.NET Coreイメージのタグのネーミングルール

[version]-[kind]-[os]-[chip] という構成でタグ名がつけられています。順に説明すると、

  • version : .NET Coreのバージョンを指します。
  • kind : イメージの種類を指します。
    • sdk : .NET Core SDKが入ってます。非プロダクション環境向けに使いましょう。
    • aspnetcore-runtime : .NET CoreランタイムおよびASP.NET Coreランタイムが入っている、ASP.NET Coreアプリケーション向けのイメージです。
    • runtime : .NET Coreランタイムが入っている、.NET Coreアプリケーション向けのイメージです。
    • runtime-deps : オペレーティング システムと .NET Core で必要とされるすべてのネイティブ依存関係が含まれます。自己完結型のアプリケーションを実行する際に使うと良いです。
  • os : ベースイメージのOSを指します。
  • chip : チップセット

その他、下記のドキュメントに細かく説明が記載されています。

docs.microsoft.com

latestタグはどれになる?

記事執筆時点(2019/01/13)では latest タグは 2.2.102-sdk-stretch というタグに割り当てられています。
ただしlatestタグは変わるものなので特別な事情がない限り、使わないことをオススメします。

f:id:tech-tsubaki:20190113155042p:plain

ASP.NET CoreのMiddlewareで依存関係を解決する方法

ASP.NET Core 2.xの内容です。1.xについては未検証。

ASP.NET Coreでは依存関係(Dependency Injection / DI)の取扱いがすごく簡単になっています。
なのでMiddlewareでもDIを使いたい場面がでてきます。例えばロガーとか。

Middlewareについての説明は省略しますので、公式ドキュメントを参照してください。

docs.microsoft.com

HTTPリクエスト/レスポンスの流れのなかに処理を差し込むパイプラインが用意されているイメージです。

pipeline

Middlewareでの依存関係の解決方法

ざっくりいうと .NET Coreでの依存関係解決は「コンストラクタ引数に使用したいオブジェクトを指定する」という方法になります。
ControllerやService、Repositoryなんかを使う方はイメージしやすいかと思います。
Middlewareも例に漏れず同じ方法になります。

この記事で詳細な説明をしますがサンプルコードが見たい方はこちらをどうぞ。

github.com

こんなMiddlewareが登録されていたとする

Startup.cs (該当箇所のみ記載)

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseMiddleware<MyMiddleware>();
    }
}

Startup.cs でMiddlewareを登録する際は、特にDIコンテナー内のオブジェクトは指定しません。

素の状態のMiddleware

MyMiddleware.cs
nextという変数はMiddlewareのルールとして必要なオブジェクトになります。

public class MyMiddleware
{
    private readonly RequestDelegate next;

    public MyMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        await next(context);
    }
}

コンストラクタ引数で依存関係を解決する

MyMiddleware.cs にロガーを取り出す処理を実装してみます。
Middlewareのコンストラクタ引数にロガーを指定するだけで済みます。
取り出したロガーは readonly なフィールド変数として保管しておくと他のメソッドで利用することができます。

public class MyMiddleware
{
    private readonly RequestDelegate next;
    private readonly ILogger<MyMiddleware> logger;

    public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger)
    {
        this.next = next;
        this.logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        logger.LogInformation($"QueryString: {context.Request.QueryString}");
        await next(context);
    }
}

要求ごとに依存関係を解決する

Startup.cs で何かしらのオブジェクトをDIに登録する際に、有効期間を1要求ごと( AddScoped )にしている場合、Middlewareではコンストラクタ引数で依存関係を解決するのではなく、要求ごとに依存関係を解決する必要があります。

docs.microsoft.com

ミドルウェアでスコープ サービスを使用している場合、サービスを Invoke または InvokeAsync メソッドに追加します。 コンストラクターを使用して挿入すると、サービスがシングルトンのように動作するよう強制されるので、コンストラクターを使用した挿入は行わないでください。 詳細については、「ASP.NET Core のミドルウェア」を参照してください。

Startup.cs の例 (該当箇所のみ記載)

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
    }
}

MyMiddleware.cs

「要求ごとに依存関係を解決する」とはどういうことかというと、ミドルウェアパイプライン上で呼び出されるごとということなので、 InvokeAsync メソッドに引数を追加することで依存関係を解決します。

public class MyMiddleware
{
    private readonly RequestDelegate next;

    public MyMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext context, IMyService myService)
    {
        string message = myService.Say("tsubakimoto");
        await next(context);
    }
}

PHPカンファレンス福岡2019の実行委員長を務めることになりました&スポンサー募集のお願い #phpconfuk

PHPカンファレンス福岡2019の実行委員長を務めることになりました

phpcon.fukuoka.jp

私を知っている方々はC#erのイメージが強いかと思いますが、PHPも使ったりします。
昨年のカンファレンスの懇親会のときに、2018年の実行委員長と2015年の実行委員長から任命していただきました。

私も2016年のカンファレンスからスタッフとして関わっており、2016年には登壇もしている思い入れの強いイベントです。

tsubalog.hatenablog.com

www.youtube.com

PHPカンファレンス福岡自体、PHPネタオンリーではなく「PHPerが気になる・PHPerに聞いてほしい」テーマであればなんでもOKみたいな感じです。
例年、PHP以外のプログラミング言語フレームワークのセッションなんかも採択されています。

PHPカンファレンス福岡のイベント運営は、とても丁寧で準備に時間をかけて、参加者やスピーカー、スポンサーにカンファレンスを楽しんでもらおうという意識を感じる、控えめに言って素晴らしいです。
スタッフしながらでもとても学びになります。

そんなPHPカンファレンス福岡の今年の実行委員長を務めますので、宜しくお願い致します。
開催日は2019年6月29日(土)、場所は例年通り福岡ファッションビルです。参加してね。

すでに準備は進んでおり、昨年末にスポンサー募集のお知らせを公開しました。
嬉しいことにプラチナスポンサー、ゴールドスポンサー、コーヒースポンサーは売り切れて、現在募集中はシルバースポンサーとブロンズスポンサーとなっています。
スポンサーに興味ある企業がありましたら、ぜひサイトから資料をダウンロードしてください。

phpcon.fukuoka.jp