2017-10-26 7 views
0

私は非同期アクションフィルタ(IAsyncActionFilter)を持っています。私はすべての方法でそれが世界的に働くことを望みます。私はその後、グローバルフィルタ正しい登録方法

public static void RegisterRequestFilter(this IServiceCollection services) 
    { 
     services.AddMvc(options => 
     { 
      options.Filters.Add(typeof(RequestFilter)); 
     }); 
    } 

など拡張メソッドであることを行うことができます

services.RegisterRequestFilter(); 

のようにそれを登録するスタートアップクラスで

services.AddMvc(options => 
{ 
    options.Filters.Add(typeof(RequestFilter)); 
}); 

を登録することができ起動時に使用しますが、それが正しいかどうかわかりません。の2回の出現があるためです:1つはパラメータなし、2番目はオプションパラメータです。

これは正しい方法ですか、それとも良い解決法ですか?

+1

エクステンションメソッドを追加した場合、もう一方のコールは必要ありません。 – Nikolaus

+1

私はこれが最善の方法だと思う、少なくとも私はより良いものを考え出すことはできない –

答えて

0

AddMvc()コールが複数ある場合に問題はありません。フードの下に登録されているAddMvcというサービスは、複数回登録されないように登録されていますが、そうであっても一般に問題はありません。

もちろん、拡張メソッドの名前をAddMvcWithRequestFilterとするだけで、AddMvc()を別々に呼び出す代わりにそのメソッドを呼び出すことができます。そうすれば、あなたはそれを一度呼び出すだけです。しかし、やはりそれはそれほど大きな違いにはなりません。

あなたが本当にあなたの拡張メソッド内からAddMvc()を呼び出さないようにしたい場合は、あなたもちょうどこのように、直接MvcOptionsを設定することができます。その時点で

public static void RegisterRequestFilter(this IServiceCollection services) 
{ 
    services.Configure<MvcOptions>(options => 
    { 
     options.Filters.Add(typeof(RequestFilter)); 
    }); 
} 

、あなたも、この拡張メソッド作る検討することもできIMvcBuilderの代わりに:

public static IMvcBuilder AddRequestFilter(this IMvcBuilder builder) 
{ 
    builder.Services.Configure<MvcOptions>(options => 
    { 
     options.Filters.Add(typeof(RequestFilter)); 
    }); 
    return builder; 
} 

その後、あなたはStartupでこのようにそれを呼び出すことができます。

services.AddMvc() 
    .AddRequestFilter(); 

これはおそらく、ここでは「最もクリーンな」アプローチになります。

+0

ありがとう! :) – Pawel

関連する問題