如何高效构建ASP.NET Core MVC应用中的Controller?

摘要:从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组ControllerModel对象,每个Con
从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组ControllerModel对象,每个ControllerModel对象是应用模型针对Controller类型的描述。 一、ControllerModel 二、 实例演示:Controller模型的构建 三、实例演示:定制Controller模型 一、ControllerModel描述Controller类型的ControllerModel具有如下定义。该类型的Application属性返回作为当前应用模型的ApplicationModel对象。它的Actions属性返回的ActionModel是对所有定义在当前Controller类型中的Action方法的描述。描述Controller类型属性的PropertyModel对象则存放在ControllerProperties属性中,由于PropertyModel和描述Action方法参数的ParameterModel对象承载的都是服务于模型绑定的元数据,所以我们会将这两个类型的介绍放在一起。ControllerModel类型的Selectors属性返回的一组SelectorModel对象是对应用在Controller级别上的Action选择器的描述,我们会在后续内容中对SelectorModel对象进行单独介绍。 public class ControllerModel : ICommonModel, IFilterModel, IApiExplorerModel { public ApplicationModel Application { get; set; } public IList<ActionModel> Actions { get; } public IList<PropertyModel> ControllerProperties { get; } public IList<SelectorModel> Selectors { get; } public IDictionary<object, object> Properties { get; } public IList<IFilterMetadata> Filters { get; } public ApiExplorerModel ApiExplorer { get; set; } public TypeInfo ControllerType { get; } public IReadOnlyList<object> Attributes { get; } public string ControllerName { get; set; } public string DisplayName { get; } public IDictionary<string, string> RouteValues { get; } MemberInfo ICommonModel.MemberInfo { get; } string ICommonModel.Name { get; } } ControllerModel类型同时实现了ICommonModel、IFilterModel和IApiExplorerModel接口。默认注册的DefaultApplicationModelProvider会对ControllerModel对象做如下的设置:ControllerType和MemberInfo属性会设置为当前Controller的类型,该类型名称去除“Controller”后缀的字符串会作为Name和ControllerName的属性值。通过标注的特性注册到Controller类型上的过滤器会被提取出来,对应的元数据会添加到Filters属性中。ApiExplorer属性返回的ApiExplorerModel对象由标注在Controller类型上实现了IApiDescriptionGroupNameProvider和IApiDescriptionVisibilityProvider接口的特性构建而成。
阅读全文