- 1. services.AddMvcCore()">1. services.AddMvcCore()
- 2. services.AddControllers()">2. services.AddControllers()
- 3. services.AddRazorPages()">3. services.AddRazorPages()
- 4. services.AddControllersWithViews()">4. services.AddControllersWithViews()
- 5. services.AddMvc()">5. services.AddMvc()
- 6. 差不多明白了区别,看一看源码吧:
1. services.AddMvcCore()
只注册路由请求和执行控制器所必要的核心服务,确保 Pipeline 程序可运转。除非是有能力并想完全去自主DIY,一般不建议直接使用这个。2. services.AddControllers()
除包含了 AddMvcCore() 所有功能,再加上:- Authorization
- ApiExplorer
- Data Annotation
- Formatter Mapping
- CORS
3. services.AddRazorPages()
包含 AddMvcCore() 所有功能,再加上:- Razor Pages
- Authorization
- Data Annotation
- Cache Tag Helper
4. services.AddControllersWithViews()
包含 AddControllers() 所有功能,再加上:- cshtml和Razor View
- Cache Tag Helper
5. services.AddMvc()
包含 AddControllersWithViews() 及 AddRazorPages() 功能。 包含的功能最为齐全,如果不想遗漏功能,直接使用这个就行。 一张图应该能准确的概括上面一堆文字叙述:
6. 差不多明白了区别,看一看源码吧:
MvcServiceCollectionExtensions.AddMvc()
/// <summary>/// Adds MVC services to the specified <see cref="IServiceCollection" />./// </summary>/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>public static IMvcBuilder AddMvc(this IServiceCollection services){if (services == null){throw new ArgumentNullException(nameof(services));}services.AddControllersWithViews();return services.AddRazorPages();}/// <summary>/// Adds MVC services to the specified <see cref="IServiceCollection" />./// </summary>/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>/// <param name="setupAction">An <see cref="Action{MvcOptions}"/> to configure the provided <see cref="MvcOptions"/>.</param>/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>public static IMvcBuilder AddMvc(this IServiceCollection services, Action<MvcOptions> setupAction){if (services == null){throw new ArgumentNullException(nameof(services));}if (setupAction == null){throw new ArgumentNullException(nameof(setupAction));}var builder = services.AddMvc();builder.Services.Configure(setupAction);return builder;}
MvcServiceCollectionExtensions.AddControllersWithViews()
通过对比发现AddMvc方法比AddControllersWithViews多了一个AddRazorPages()
/// <summary>/// Adds services for controllers to the specified <see cref="IServiceCollection"/>. This method will not/// register services used for pages./// </summary>/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>/// <remarks>/// <para>/// This method configures the MVC services for the commonly used features with controllers with views. This/// combines the effects of <see cref="MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection)"/>,/// <see cref="MvcApiExplorerMvcCoreBuilderExtensions.AddApiExplorer(IMvcCoreBuilder)"/>,/// <see cref="MvcCoreMvcCoreBuilderExtensions.AddAuthorization(IMvcCoreBuilder)"/>,/// <see cref="MvcCorsMvcCoreBuilderExtensions.AddCors(IMvcCoreBuilder)"/>,/// <see cref="MvcDataAnnotationsMvcCoreBuilderExtensions.AddDataAnnotations(IMvcCoreBuilder)"/>,/// <see cref="MvcCoreMvcCoreBuilderExtensions.AddFormatterMappings(IMvcCoreBuilder)"/>,/// <see cref="TagHelperServicesExtensions.AddCacheTagHelper(IMvcCoreBuilder)"/>,/// <see cref="MvcViewFeaturesMvcCoreBuilderExtensions.AddViews(IMvcCoreBuilder)"/>,/// and <see cref="MvcRazorMvcCoreBuilderExtensions.AddRazorViewEngine(IMvcCoreBuilder)"/>./// </para>/// <para>/// To add services for pages call <see cref="AddRazorPages(IServiceCollection)"/>./// </para>/// </remarks>public static IMvcBuilder AddControllersWithViews(this IServiceCollection services){if (services == null){throw new ArgumentNullException(nameof(services));}var builder = AddControllersWithViewsCore(services);return new MvcBuilder(builder.Services, builder.PartManager);}/// <summary>/// Adds services for controllers to the specified <see cref="IServiceCollection"/>. This method will not/// register services used for pages./// </summary>/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>/// <param name="configure">An <see cref="Action{MvcOptions}"/> to configure the provided <see cref="MvcOptions"/>.</param>/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>/// <remarks>/// <para>/// This method configures the MVC services for the commonly used features with controllers with views. This/// combines the effects of <see cref="MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection)"/>,/// <see cref="MvcApiExplorerMvcCoreBuilderExtensions.AddApiExplorer(IMvcCoreBuilder)"/>,/// <see cref="MvcCoreMvcCoreBuilderExtensions.AddAuthorization(IMvcCoreBuilder)"/>,/// <see cref="MvcCorsMvcCoreBuilderExtensions.AddCors(IMvcCoreBuilder)"/>,/// <see cref="MvcDataAnnotationsMvcCoreBuilderExtensions.AddDataAnnotations(IMvcCoreBuilder)"/>,/// <see cref="MvcCoreMvcCoreBuilderExtensions.AddFormatterMappings(IMvcCoreBuilder)"/>,/// <see cref="TagHelperServicesExtensions.AddCacheTagHelper(IMvcCoreBuilder)"/>,/// <see cref="MvcViewFeaturesMvcCoreBuilderExtensions.AddViews(IMvcCoreBuilder)"/>,/// and <see cref="MvcRazorMvcCoreBuilderExtensions.AddRazorViewEngine(IMvcCoreBuilder)"/>./// </para>/// <para>/// To add services for pages call <see cref="AddRazorPages(IServiceCollection)"/>./// </para>/// </remarks>public static IMvcBuilder AddControllersWithViews(this IServiceCollection services, Action<MvcOptions> configure){if (services == null){throw new ArgumentNullException(nameof(services));}// This method excludes all of the view-related services by default.var builder = AddControllersWithViewsCore(services);if (configure != null){builder.AddMvcOptions(configure);}return new MvcBuilder(builder.Services, builder.PartManager);}
