Chuyển đến nội dung chính

Sử dụng in-memory database trong Entity Framework

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

Có quá nhiều thứ để implement, nào là Repository, nào là EF Core, rồi thêm Swagger nữa.
Để bắt đầu đơn giản nhất, chúng ta sẽ lần lượt thực hiện các bước sau:
  • 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ụng
public 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: image host 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

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.