Entity Framework Core cho phép bạn lưu trữ và truy xuất dữ liệu đến và từ cơ sở dữ liệu sử dụng bộ nhớ chính của máy tính để lưu trữ (in-memory database). Đây là một cách nhanh chóng và dễ dàng để kiểm tra các ứng dụng web ASP.NET Core 7.
Có nhiều lý do tại sao bạn có thể muốn sử dụng in-memory database. Giả sử bạn đang phát triển một tính năng mới và muốn thử nghiệm tính năng đó mà không ảnh hưởng đến database của mình. Hoặc đơn giản là bạn muốn viết ví dụ và không cần phải xóa database vừa tạo.
Ý tưởng
- Tạo Model class: Author và Book
2 model này đại diện cho 2 entity mà chúng ta sẽ khai báo trong Entity Framework - Cài đặt package EF Core InMemory NuGet.
- Tạo DbContext class
- Khai báo Repository class: IAuthorRepository và AuthorRepository
- Khai báo Dependency Injection
- Cài đặt và khai báo Swagger
- Khai báo Controller
Khai báo Model
Chúng ta khai báo 2 model Author và Book để làm việc với data trong ứng dụngpublic class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Book> Books { get; set; }
}
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public Author Author { get; set; }
}
Để khai báo DbContext, bạn cần cài đặt package Microsoft.EntityFrameworkCore.InMemory
Install-Package Microsoft.EntityFrameworkCore.InMemory
Khai báo DbContext
public class ApiContext: DbContext
{
public DbSet<Author> Authors { get; set; }
public DbSet<Book> Books { get; set; }
public ApiContext(DbContextOptions<ApiContext>
options) : base(options)
{
}
}
Khai báo Repository
Chúng ta tạo AuthorModel, IAuthorRepository, và AuthorRepository để implement method lấy danh sách Author trả về.public class AuthorModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public interface IAuthorRepository
{
public List<AuthorModel> GetAuthors(int pageSize, int page);
}
public class AuthorRepository: IAuthorRepository
{
private readonly ApiContext _dbContext;
public AuthorRepository(ApiContext dbContext)
{
_dbContext = dbContext;
}
public List<AuthorModel> GetAuthors(int pageSize, int page)
{
var list = _dbContext.Authors.Skip(pageSize * page).Take(pageSize).Select(t => new AuthorModel
{
FirstName = t.FirstName,
LastName = t.LastName,
Id = t.Id,
}).ToList();
return list;
}
}
Khai báo Dependency Injection
The Dependency Injection pattern is a particular implementation of Inversion of Control. Inversion of Control (IoC) means that objects do not create other objects on which they rely to do their work. Instead, they get the objects that they need from an outside source (for example, an xml configuration file). Dependency Injection (DI) means that this is done without the object intervention, usually by a framework component that passes constructor parameters and set properties.Có thể hiểu: Inversion of Control (IoC) có nghĩa rằng các object không phải tự nó tạo ra các objects mà nó phụ thuộc. Thay vào đó, nó sẽ có những objects nó cần nhờ vào một bên thứ ba. ASP.NET Core cho phép chúng ta đăng ký các dịch vụ ứng dụng của mình với IoC container, trong file Program.cs. Chúng ta đăng ký Repository trong IServiceCollection
builder.Services.AddScoped<IAuthorRepository, AuthorRepository>();
builder.Services.AddDbContext<ApiContext>(o => o.UseInMemoryDatabase("MyDatabase"));
Cài đặt và sử dụng Swagger
Để thuận tiện test API, chúng ta sử dụng Swagger để gọi API
Swagger là một bộ công cụ mã nguồn mở để xây dựng OpenAPI specifications giúp chúng ta có thể thiết kế, xây dựng tài liệu và sử dụng REST APIs.
Swagger cung cấp 3 tools chính cho các developers:
- Swagger-Editor : dùng để design lên các APIs hoàn toàn mới hoặc edit lại các APIs có sẵn thông qua 1 file config.
- Swagger-Codegen : dùng để generate ra code từ các file config có sẵn
- Swagger-UI : dùng để generate ra file html,css,… từ 1 file config.
dotnet add package Swashbuckle.AspNetCore
Sau dòng khai báo DI, bạn thêm đoạn code sau:
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API V1", Version = "v1" });
});
Khai báo UserSwagger() trước app.UseRouting();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
app.UseStaticFiles();
Khai báo Controller
Thêm AuthorsController và phương thức Get() để trả về Authors[Route("api/[controller]")]
[ApiController]
public class AuthorsController : ControllerBase
{
private readonly IAuthorRepository _authorRepository;
public AuthorsController(IAuthorRepository authorRepository)
{
_authorRepository = authorRepository;
}
[HttpGet]
public ActionResult<List<Author>> Get(int pageSize, int pageIndex)
{
return Ok(_authorRepository.GetAuthors(pageSize, pageIndex));
}
}
Thêm Fake data
Để có data trả về trong phương thức _authorRepository.GetAuthors(), bạn thêm data vào memory khi app build()var app = builder.Build();
AddCustomerData(app);
static void AddCustomerData(WebApplication app)
{
var scope = app.Services.CreateScope();
var context = scope.ServiceProvider.GetService<ApiContext>();
var authors = new List<Author>
{
new Author
{
FirstName ="Joydip",
LastName ="Kanjilal",
Books = new List<Book>()
{
new Book { Title = "Mastering C# 8.0"},
new Book { Title = "Entity Framework Tutorial"},
new Book { Title = "ASP.NET 4.0 Programming"}
}
},
new Author
{
FirstName ="Yashavanth",
LastName ="Kanetkar",
Books = new List<Book>()
{
new Book { Title = "Let us C"},
new Book { Title = "Let us C++"},
new Book { Title = "Let us C#"}
}
},
new Author
{
FirstName ="Hector Malot",
LastName ="Kanetkar",
Books = new List<Book>()
{
new Book { Title = "Let us C"},
new Book { Title = "Let us C++"},
new Book { Title = "Let us C#"}
}
},
new Author
{
FirstName ="Jack",
LastName ="Lodnon",
Books = new List<Book>()
{
new Book { Title = "Let us C"},
new Book { Title = "Let us C++"},
new Book { Title = "Let us C#"}
}
},
new Author
{
FirstName ="Geogre",
LastName ="Washington",
Books = new List<Book>()
{
new Book { Title = "Let us C"},
new Book { Title = "Let us C++"},
new Book { Title = "Let us C#"}
}
}
};
context.Authors.AddRange(authors);
context.SaveChanges();
}
Mở ứng dụng, vào trang swagger, bạn gọi api Authors/Get:
Source code: https://github.com/anbinhtrong/EntityFrameworkInMemroy7Demo
Tham khảo
How to use EF Core as an in-memory database in ASP.NET Core 6
https://viblo.asia/p/co-ban-ve-swagger-oOVlYjOV58W
Chúc các bạn thành công!
Nhatkyhoctap's blog
Nhận xét
Đăng nhận xét