ASP.NET WebAPI 10 Actionの選択(二)
3992 ワード
本シリーズの第2編では、Actionの選択条件について簡単に述べた本編では、Actionの選択過程について詳しく述べた.前編では、Controllerのアクティブ化過程でControllerを設定するController Contextについて述べ、次にHttpControllerを呼び出すExectuteAsync方法について述べた.この方法では,HttpActionDescriptorを選択し,パラメータバインドを行い,Acitonを実行する2つのステップに大別できる.
HttpControllerDescriptorのように、HttpActionDescriptorにもActionの基本情報が保存されています.実行方法(ExecuteAsync)が提供されています.
HttpControllerDescriptorと同様に、ConfigurationもGlobalConfigurationを参照する.コンフィギュレーション、ActionName、ReturnTypeはそれぞれActionの名前と戻り値を表します.SupportedHttpMethodsは、ActionがサポートできるHttpMethodの集合を表す.HttpActionDescriptorには、HttpActionDescriptorにデータを追加する読み取り専用プロパティがあります.
WebAPIにおけるHttpActionDescriptorのデフォルト派生クラスは、ReflectedHttpActionDescriptorです.
HttpActionDescriptorの場合、ReflectedHttpActionDescriptorには1つのMethodInfoしか追加されていません.ReflectedHttpActionDescriptorのネーミングとMethodInfoプロパティから、ReflectedHttpActionDescriptorがActionを反射的に実行することが考えられます.
Actionのパラメータについては、Actionの選択に参加するだけでなく、WebAPIを行う際にもパラメータをバインドする際に複雑な論理があるため、WebAPIはActionのパラメータ、すなわちHttpParameterDescriptorをカプセル化している.
HttpActionDescriptorでのGetParametersメソッドは、Actionの下にあるHttpParameterDescriptorのセットを返すことです.
WebAPIにおけるHttpParameterDescriptorの派生クラスはReflectedHttpParameterDescriptorである.
HttpActionSelectorもWebAPIの「標準化コンポーネント」であり、その名の通りActionを検索するために使用されます.
HttpControllerSelector、IHttpActionSelectorとも、2つの方法を提供しています.GetActionMaping、SelectActionは、それぞれControllerの下のすべてのActionと要求のActionを返すために使用されます.
反射は解析方法の場合に相対的に時間のかかる操作であるため,ReflectionActionDescriptorもキャッシュした.
HttpActionDescriptor
HttpControllerDescriptorのように、HttpActionDescriptorにもActionの基本情報が保存されています.実行方法(ExecuteAsync)が提供されています.
public abstract class HttpActionDescriptor
{
public abstract string ActionName { get; }
public HttpConfiguration Configuration { get; set; }
public HttpControllerDescriptor ControllerDescriptor { get; set; }
public virtual ConcurrentDictionary<object, object> Properties { get; }
public abstract Type ReturnType { get; }
public virtual Collection<Net.Http.HttpMethod> SupportedHttpMethods { get; }
public abstract Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken);
public virtual Collection<T> GetCustomAttributes<T>() where T : class;
public virtual Collection<T> GetCustomAttributes<T>(bool inherit) where T : class;
public virtual Collection<Filters.IFilter> GetFilters();
}
HttpControllerDescriptorと同様に、ConfigurationもGlobalConfigurationを参照する.コンフィギュレーション、ActionName、ReturnTypeはそれぞれActionの名前と戻り値を表します.SupportedHttpMethodsは、ActionがサポートできるHttpMethodの集合を表す.HttpActionDescriptorには、HttpActionDescriptorにデータを追加する読み取り専用プロパティがあります.
WebAPIにおけるHttpActionDescriptorのデフォルト派生クラスは、ReflectedHttpActionDescriptorです.
public class ReflectedHttpActionDescriptor : HttpActionDescriptor
{
public MethodInfo MethodInfo { get; set; }
}
HttpActionDescriptorの場合、ReflectedHttpActionDescriptorには1つのMethodInfoしか追加されていません.ReflectedHttpActionDescriptorのネーミングとMethodInfoプロパティから、ReflectedHttpActionDescriptorがActionを反射的に実行することが考えられます.
HttpParameterDescriptor
Actionのパラメータについては、Actionの選択に参加するだけでなく、WebAPIを行う際にもパラメータをバインドする際に複雑な論理があるため、WebAPIはActionのパラメータ、すなわちHttpParameterDescriptorをカプセル化している.
public abstract class HttpParameterDescriptor
{
public HttpActionDescriptor ActionDescriptor { get; set; }
public HttpConfiguration Configuration { get; set; }
public virtual object DefaultValue { get; }
public virtual bool IsOptional { get; }
public virtual ParameterBindingAttribute ParameterBinderAttribute { get; set; }
public abstract string ParameterName { get; }
public abstract Type ParameterType { get; }
public virtual string Prefix { get; }
public ConcurrentDictionary<object, object> Properties { get; }
public virtual Collection<T> GetCustomAttributes<T>() where T : class;
}
HttpActionDescriptorでのGetParametersメソッドは、Actionの下にあるHttpParameterDescriptorのセットを返すことです.
WebAPIにおけるHttpParameterDescriptorの派生クラスはReflectedHttpParameterDescriptorである.
HttpActionSelector
HttpActionSelectorもWebAPIの「標準化コンポーネント」であり、その名の通りActionを検索するために使用されます.
public interface IHttpActionSelector
{
ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor);
HttpActionDescriptor SelectAction(HttpControllerContext controllerContext);
}
HttpControllerSelector、IHttpActionSelectorとも、2つの方法を提供しています.GetActionMaping、SelectActionは、それぞれControllerの下のすべてのActionと要求のActionを返すために使用されます.
反射は解析方法の場合に相対的に時間のかかる操作であるため,ReflectionActionDescriptorもキャッシュした.