2015-10-14 4 views
17

私はMVC6のミドルウェアの概念を理解しようとしています。それはまだ私には漠然としています。私は実際にあなたがStartupクラスで得るいくつかの "標準的な"変数の違いを見ません。mvc6のアプリケーション、サービス、ミドルウェアの違い

特定のミドルウェアを使用する必要があることをアプリケーションに伝える3通りの方法があります。

サービスを使用してミドルウェアを呼び出すことができます。しかし、これはミドルウェアを "追加"するだけのようです。

services.AddMvc(); 

// Add other services 
services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
services.AddScoped<IEmailer, Emailer>(); 

次に、IApplicationBuilder appです。これは実際にサービスにロードされているミドルウェアを使用することですか?利点はを使用して/を登録次の3種類を持っている何

app.UseMiddleware<MyCustomMiddleware>(); 

:だからあなたが好きそれを呼び出すことができます。

app.UseMvc(); 
app.UseErrorPage(...); 
app.UseIdentity(); // cookie authentication 

そして、このようにミドルウェアをロードして使用する方法がありますミドルウェア?彼らの正確な違いは何ですか?パイプラインの構築2つのフェーズがあります

答えて

12

。サービス

これは、基本的にはASPネット5.(IServiceCollectionインタフェース)

あなたができる最も単純なことで構築された依存性注入コンテナにあなたの機能で必要なクラスを登録しているの追加

やるのようにそれらを一つずつ手動で追加された:あなたは、より複雑なアプリケーション、または自己完結型のフレームワークを構築している場合は、あなたが作成することもできます

services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
services.AddScoped<IEmailer, Emailer>(); 

必要なすべてのサービスを登録する関数。

public static void AddMyServices(this IServiceCollection services) 
{ 
    services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
    services.AddScoped<IEmailer, Emailer>(); 
    ... 
} 

//register all your services just by running the ext method: 
services.AddMyServices(); 

services.AddMvc();がやっている正確に何である:それを行うための良い方法は、拡張メソッドを作成することです。

より柔軟な方法で

それはあなたがさらにモデルバインダーのようなデフォルトのサービスをカスタマイズするためのラムダを渡すことができますよう(services.AddMvc(opts => opts.ModelBinders ...)のように)、あなたはさらに(それをビューエンジンのようなものをカスタマイズするために使用することができますIMvcBuilderを返しますservices.AddMvc().AddViewOptions(opts => opts.ViewEngines ...)のように)。

の実装を確認してくださいミドルウェアのサーバ及び検査するアプリケーション、ルート間パイプラインを形成する成分を介して渡し -

ミドルウェア:うまくそれが要約ミドルウェアを説明アンドレイDzimchukによって[素敵なブログエントリ(http://dzimchuk.net/post/understanding-aspnet-5-middleware)があります特定の目的のために要求メッセージと応答メッセージを変更することができます。

この定義は、ASP.NET 5にも適用されます。ミドルウェアは、従来のASP.NETで持っていたHTTPモジュールとハンドラの両方として考えることができます。いくつかのミドルウェアは、認証、セッション状態取得と永続性、ロギングなどの要求を処理するときにさまざまな中間タスクを実装します。それらのうちのいくつかは、応答を生成する究極の要求ハンドラになります。

これで、ASPパイプラインに独自の動作を追加します。あなたはまた、create your own middleware classして登録することができます

app.Use(async (context, next) => 
{ 
    //do something before passing the request to the next middleware 
    await next.Invoke(); 
}); 

app.UseMiddleware<MyMiddleware>(); 

最後に、あなたが再び複雑なセットアップロジックをカプセル化するために拡張メソッドを定義することができ

最も単純なことは、インラインミドルウェアを定義しています。

これはapp.UseMvc()の機能です。それはあなたのルートを定義することができますし、app.UseRouter()を呼び出してルーティングミドルウェアを追加します。あなたが見ることができるように、app.UseRouterの実装はbuilder.UseMiddleware<RouterMiddleware>(router);

を呼び出して、パイプラインにRouterMiddlewareを追加し、あなたのミドルウェアが必要とするサービスは、以前に登録されていたであろう。これは、DIコンテナを使用してミドルウェアが利用できることを意味します。


最終的な結果は、あなたが基本的に必要なだけビットを含むアプリケーションで必要なコンポーネント(サービス)と行動(ミドルウェア)、ミックスと一致するためのフレームワークが容易になることです。

+0

リンクは非常にhelpulだった、ありがとう – wodzu

2

:パイプライン

AddMvcにミドルウェアを追加するDI

  • のためのサービスを登録

    • は、MVC(例えば、ビューを必要とするサービスを登録しますエンジン、JSONフォーマッタなど)、パイプラインには何も追加しません。

      UseMiddleware<T>は、ミドルウェアをパイプラインに追加する一般的な方法です。このメソッドは、DIシステムを使用して、ミドルウェアクラスのコンストラクタを介して依存性を注入します。

      UseMvcなどは、構成オプションを渡すことを容易にする拡張方法である。カスタムミドルウェアを作成する場合は、ミドルウェアの設定方法に応じて、UseMiddleware<T>に電話するか、または拡張方法を指定するだけです。

      あなたはここでより多くの情報を見つけることができます:私は、サービスの追加やミドルウェアを追加することを区別しますhttps://docs.asp.net/en/latest/fundamentals/middleware.html

  • 7

    私はダニエルの答えに実際の例を追加したいと思います。 (彼の答えは非常に詳細で正確で、これを最初にチェックしてください)。

    TL; DRは:

    services.Add直接ミドルウェアに関連していません。 Dependency Injection Containerに依存関係を登録することです。

    app.Useは、どのコードがパイプライン(論理)で実行され、どの順序でパイプラインが実行され、パイプラインが処理を続けることができるかについてです。想像力はここでの制限です。IPアドレスによっては「あなたの国で申し訳ありませんサービスが利用できません」というミドルウェアを書く例があります)

    app.UseMiddlewareapp.Useと同じですコードをインラインで宣言する代わりに、呼び出されるInvokeメソッドを持つクラスを指定します。

    それでは、いくつかのサンプルコードを取得してみましょう:

    は、あなたがあなたのアプリケーションがHTMLをminifingのように、あなたの出力や、あなたの出力の一部を処理したいとしましょう。

    出力に出力する前に応答をインターセプトするミドルウェアを追加して、それを縮小することができます。

    あなたが使用することができます。

    app.Use(async (context, next) => 
    { 
        await next(context); 
        context.Response // will have the response as processed by all the previous middleswares like mvc. 
        if IsMinifiable(context.Response) 
        MinifyResponse(context.Response); 
    
    }); 
    

    を使用すると、さまざまなアプリケーションや他の人があなたのミドルウェアを共有したい場合は、ミドルウェアを作成したいとより多くのようにそれを使用することがあります。

    app.UseMiddleware<HtmlMinifierMiddleware>(); 
    

    これは、configureメソッドで1行のコードですべての作業を行います。 app.UseHtmlMinifier()のような拡張メソッドを出荷し、構成に連鎖したり構成パラメータをサポートできる特定のオブジェクトを返すのが一般的です。拡張を使用することで、柔軟性、可読性やAPI見つけやすさの多くを提供します:あなたが見ることができるように、あなたがIHtmlMiniferを渡す必要があるので、あなたが必要とする

    public class HtmlMinifierMiddleware { 
        public HtmlMinifier(IHtmlMinifier minifier) { 
         // ... 
        } 
        public string Minify(string content) { 
         return minifier.Minify(content); 
        } 
        // ... 
    } 
    

    :D

    は今、あなたのミドルウェアがdelcaredされ、このようなものを想像しますDIのためにそれを登録する。

    これは、同じようConfigureService上で達成される:

    services.AddScoped<IHtmlMinifier, MyCoolHtmlMinifier>(); 
    

    は、今あなたが1を必要はありません想像するが、多くの依存関係、それはする必要がありますすべての単一の依存関係を知るためのミドルウェアの開発者/消費者次第となります登録された

    ミドルウェアの作者は、通常、DIコンテナへの登録サービスの拡張方法であるservices.AddHtmlMinifier()のように、開発者の使用を容易にする拡張機能を出荷しています。

    ミドルウェアを使用していない場合でも、同じパターンを使用して独自のアプリケーションの依存関係を活用できます。

    あなたのアプリがeコマースである場合たとえば、あなたはあなたの依存関係を登録する拡張メソッドを作成することができます:services.AddProductManagement()services.AddPriceCalculator()services.AddSearching()など、それともservices.AddMyCoolApplication()(登録)追加のきれいな方法を提供するために、あなたのサービス(依存関係) DIコンテナによってアプリケーションで検索されます。

    +1

    非常に有用な、ありがとう。 – wodzu

    関連する問題