یک نکتهی تکمیلی: چگونه فقط Web API را در ASP.NET Core بدون اضافات MVC آن داشته باشیم؟
زمانیکه در کلاس آغازین برنامه،
متد AddMvc را فراخوانی میکنیم، به همراه آن AddViews، AddRazorViewEngine، AddRazorPages، AddCacheTagHelper و غیره نیز به صورت خودکار به برنامه اضافه میشوند و وجود آنها در آخر به معنای یکی بودن MVC و Web API با هم است. اما اگر برنامهی ما فقط یک برنامهی SPA، یا تک صفحهای وب باشد، عملا به هیچکدام از این قابلیتها نیازی نیست.
برای اینکه فقط Web API را فعال کنیم، باید از متد الحاقی دیگری به نام AddMvcCore استفاده کرد (
البته در نگارش 3x این مورد با AddControllers سادهتر شدهاست). کار آن فعالسازی routing, attributes, filters, result executors, model binders, controllers است. برای دسترسی به آن تنها نصب سه بستهی ذیل کفایت میکنند:
Microsoft.AspNetCore.Mvc.Core
Microsoft.AspNetCore.Mvc.Cors
Microsoft.AspNetCore.Mvc.Formatters.Json
در این حالت نحوهی استفادهی از MvcCore تنها، به صورت ذیل است؛ بدون به همراه داشتن ویژگیهای MVC، مانند کار با Views و TagHelpers:
namespace AspNetCoreWebAPIOnly
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
var mvcCoreBuilder = services.AddMvcCore();
mvcCoreBuilder
.AddFormatterMappings()
.AddJsonFormatters()
.AddCors();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc();
}
}
}
نکتهی مهم: در این حالت چون قسمتهای پردازش View مربوط به MVC حذف میشوند، نمیتوان از کلاس پایه Controller جهت تعریف کنترلرها استفاده کرد؛ چون این کلاس پایه، بازگشت Viewها و Partial Viewها و غیره را نیز شامل میشود. اما همین کلاس پایه Controller از کلاس عمومیتری به نام ControllerBase مشتق میشود که به معنای پشتیبانی از Web API، بدون Viewها است. بنابراین نحوهی تعریف کنترلرها اینبار به صورت ذیل خواهد بود (مشتق شدهی از ControllerBase):
namespace AspNetCoreWebAPIOnly.Controllers
{
[Route("api/[controller]")]
// ControllerBase instead of Controller
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new[] { "value1", "value2" };
}
}
}