[ASP.NET MVC] Áp dụng mẫu Repository trong Entity Framework

Design Pattern (mẫu thiết kế) - điều mà thực sự là "ác mộng" và ngán ngẩm lúc còn đi học. Và cho đến bây giờ, trong gần 30 mẫu thiết kế thì mình cũng chỉ sử dụng tối đa 3 mẫu :)) (không thường xuyên). Tuy nhiên, có một mẫu thiết kế mà bạn "nên biết và sử dụng", nhất là đối với các hành động gần như giống nhau như Entity Framework. Đó chính là mẫu Repository. Để ngắn gọn thì mình sẽ gọi là repo.

Ngữ cảnh

Giả sử bạn cần viết 1 ứng dụng quản lý học sinh. Bạn cần phải thực thi các hành động CRUD (Create, Read, Update, Delete) lên mỗi thực thể (entity), ví dụ như học sinh. Tiếp đó, bạn cũng thực thi những hành động CRUD này lên giáo viên, rồi lớp học, môn học... Có thể thấy rằng các hành động thêm, xóa, sửa được lặp đi lặp lại, trong đó chỉ có thực thể là thay đổi. Mẫu Repository giúp bạn giải quyết được vấn đề này bằng cách hết sức đơn giản.

Chú ý: nội dung bài viết này mình chỉ giới thiệu mẫu Repository, không phải hướng dẫn Entity Framework (EF). Do đó bạn cần biết EF (hoặc hiểu). Bạn cũng có thể tham khảo 1 bài viết về EF của mình tại đây.

Repository Interface

Interface định nghĩa 6 phương thức dùng để thao tác với mỗi entity. Bạn có thể định nghĩa nhiều hơn nếu muốn (nhưng điều đó không cần thiết). Và chú ý rằng, ở đây mình sử dụng kiểu Generic (template T) để định nghĩa cho interface. Điều này dễ hiểu bởi vì bạn có thể sử dụng kiểu này cho nhiều loại đối tượng sau này.

Thực thi Repository interface

Bằng việc implement Repository interface, bạn phải thực thi các phương thức của interface. Việc này khá đơn giản. ApplicationDbContext là database context của bạn và DbSet là một DbSet (table) của kiểu dữ liệu T nằm trong DbContext. Xem ví dụ dưới đây:

dbcontext

Sử dụng

Đầu tiên mình sẽ tạo ra 1 StudentRepository kế thừa từ GenericRepository. Ở đây bạn sẽ thấy T chính là Student. StudentRepository có thể sử dụng mọi phương thức của GenericRepository, và mình đã viết thêm 1 phương thức để tìm kiếm các học sinh dựa vào tên nhập vào như sau:

Chú ý: có thể bạn sẽ không cần đến lớp StudentRepository này, nhưng để việc mở rộng dễ dàng, bạn nên sử dụng nó.

Controller

Mọi việc đã trở nên đơn giản. Tất cả những gì bạn cần làm là kiểm tra dữ liệu đầu vào, kiểm tra điều kiện, các hành động phụ...

Đánh giá

Có thể ban đầu khi mới làm quen với mẫu repository, bạn sẽ thấy nó khá rườm rà, không cần thiết. Tuy nhiên, đây là cách đơn giản để bạn phân chia project theo mẫu MVVM và dễ dàng mở rộng các phương thức chuyên biệt cho mỗi entity. Nếu bạn áp dụng nó, một ngày "đẹp trời" nào đó bạn sẽ thấy được sức mạnh của mẫu Repository này. Chúc bạn ngủ ngon...à nhầm, chúc bạn thành công =)).

Comments

  1. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. Tuyệt! Anh có thể viết thêm một bài chi tiết hơn về Domain Driven Design không?

      Delete
    2. Hy vọng mình sẽ sớm biết cái đó để viết :v

      Delete
  2. giao diện Blog thiết kế rất đẹp :)

    ReplyDelete
  3. Trong Project ASP.NET MVC thì anh thường áp dụng design pattern nào?

    ReplyDelete
  4. Hay lắm đồng chí :D
    Nhưng mà sao thấy đơn giản thế?
    Tương phải fuck tạp lắm chứ nhỉ :D

    ReplyDelete
  5. bạn cho mình hỏi cái thằng ApplicationDbContext mình ko thấy có hàm Set

    ReplyDelete
  6. bạn cho mình hỏi cái thằng ApplicationDbContext mình ko thấy có hàm Set

    ReplyDelete
    Replies
    1. Bạn có thể chỉ rõ hàm Set ở đâu trong đoạn code được không?

      Delete

Post a Comment

Popular posts from this blog

Gỡ bộ Visual Studio ra khỏi máy tính

Căn giữa thẻ div trong thẻ div