از قبل مقالاتی با این عنوان در فکر بکر قرار گرفته شد اما در این آموزش میخواهیم با آپدیت جدید Asp.net core که آخرین نسخه آن Asp.net 6 میباشد مروری بر این مفاهیم داشته باشیم.
برای شروع یک پروژه از نوع API ایجاد میکنیم.
یکی از تغییراتی که در نگاه اول مورد توجه قرار می گیرد عدم وجود فایل startup.cs در پروژه می باشد . در واقع محتویات این فایل با فایل Program.cs ادغام شده است.
ابتدا موارد زیر را با استفاده از nugget به پروژه اضافه میکنیم.
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
سپس یک پوشه با نام Model ایجاد می کنیم و درون آن یک کلاس با نام People با محتویات زیر درج می کنیم.
public class People
{
public int ID { get; set; }
public string Fname { get; set; } = string.Empty;
public string Lname { get; set; } = string.Empty;
public string Fullname { get; set; } = string.Empty;
public string Phone { get; set; } = string.Empty;
}
سپس پوشه ای با نام Data ایجاد می کنیم و درون آن کلاس DataContext با محتویات زیر را به آن اضافه می کنیم
public class DataContext:DbContext
{
public DataContext(DbContextOptions<DataContext> options):base(options){}
public DbSet<People> Peoples { get; set; }
}
برای ایجاد رشته اتصال فایل appsettings را بصورت زیر ویرایش می کنیم. نام دیتابیس در این پروژه ApiSample می باشد.
{
"ConnectionStrings": {
"myCon": "server=.;database=ApiSampleDB;integrated security=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
سپس باید کلاس DataContext را با توجه به DI از طریق کلاس Program.cs به برنامه معرفی کنیم . محتویات Program.cs بصورت زیر می باشد.
global using ApiSample.Data;
global using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddDbContext<DataContext>(options => {
options.UseSqlServer(builder.Configuration.GetConnectionString("myCon"));
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
همانطور که مشاهده می کنید در دو خط اول فضای نامها را با کلمه global قرار دادیم تا بتوانیم در بخشهای مختلف پروژه از کلاسهای درون آنها استفاده کنیم.
یک بار پروژه را build نمایید و سپس برای ایجاد دیتابیس با توجه به کلاس ایجاد شده یک مایگریشن با نام دلخواه ایجاد نمایید و در ادامه دیتابیس را آپدیت کنید.
اکنون یک APIController با نام People درون پوشه Controllers ایجاد نمایید و محتویات آنرا بصورت زیر ویرایش کنید.
namespace ApiSample.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class PeopleController : ControllerBase
{
DataContext _context;
public PeopleController(DataContext context)
{
_context = context;
}
[HttpGet]
public async Task<IActionResult> Get()
{
//return BadRequest(...);
//return NotFound();
return Ok(await _context.Peoples.ToListAsync());
}
[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
var p = await _context.Peoples.FindAsync(id);
if (p == null)
return BadRequest("person not found");
return Ok(p);
}
[HttpPost]
public async Task<IActionResult> Post(People person)
{
_context.Peoples.Add(person);
await _context.SaveChangesAsync();
return Ok(await _context.Peoples.ToListAsync());
}
[HttpPut]
public async Task<IActionResult> Put(People person)
{
var p = await _context.Peoples.FindAsync(person.ID);
if (p == null)
return BadRequest();
else
{
p.Fullname = person.Fullname;
p.Phone = person.Phone;
p.Fname = person.Fname;
p.Lname = person.Lname;
await _context.SaveChangesAsync();
return Ok(await _context.Peoples.ToListAsync());
}
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int id)
{
var p = await _context.Peoples.FindAsync(id);
if (p == null)
return BadRequest("person not found");
else
{
_context.Peoples.Remove(p);
await _context.SaveChangesAsync();
return Ok(await _context.Peoples.ToListAsync());
}
}
}
}
پروژه برای اجرا آماده میباشد که شکل نهایی آن با استفاده از Swagger بصورت زیر می باشد.