Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

NHÓM 3 – T1 : THUYẾT TRÌNH REPOSITORY PATTERN – 21DTHD5

Thành viên :

Lê Quang Hiến - 2180607487


Vũ Thanh Phát - 2180607847
Huỳnh Gia Khiêm - 2180604879
Nguyễn Trọng Hiếu - 2180607500

1.Repository là gì ?
Repository Pattern là một cách tổ chức source code trong Laravel. Ý tưởng
cơ bản và mục tiêu chính để sử dụng Repository Pattern là xây dựng một lớp kết
nối giữa tầng Business Login và Data Access, giúp cho việc truy cập dữ liệu
được chặt chẽ và bảo mật hơn.

Nhìn vào ảnh này các ban có thể hình dung qua nó, Repository Pattern là lớp
trung gian giữa tầng Data Access và Business Logic, hiểu môm na thì nó là lớp
trung gian giữa việc truy cập dữ liệu và xử lý logic giúp cho việc truy cập dữ liệu
chặt chẽ và bảo mật hơn.

Bình thường để lấy dữ liệu gì đó hiển thị ra view thì chúng ta đơn giản viết
một Controller query đến Database để lấy ra dữ liệu. Nhưng với Repository
pattern như hình trên chúng ta thấy Repository nó nằm giữa, là trung gian giữa
Controller và Model. Hiểu đơn giản thì như thế này, khi có request gọi tới
controller, controller gọi tới Repository rồi Repository gọi tới model lấy data và
xử lý, controller lấy dữ liệu thì chỉ việc gọi đến Repository.

Nguyên tắc hoạt động của Repository Pattern:

1. Tách biệt lớp dữ liệu: Repository Pattern giúp tách biệt logic truy cập dữ
liệu và logic kinh doanh của ứng dụng. Điều này cho phép độc lập và dễ dàng
thay đổi trong việc truy cập dữ liệu mà không ảnh hưởng đến các thành phần
khác trong hệ thống.

2. Tích hợp dữ liệu: Repository Pattern cung cấp một cách thức tiếp cận
chung để truy xuất và tương tác với dữ liệu từ các nguồn khác nhau như cơ sở dữ
liệu SQL, NoSQL, API bên ngoài và nhiều nguồn dữ liệu khác. Việc sử dụng
Repository Pattern giúp giảm sự ràng buộc với một nguồn dữ liệu cụ thể và giúp
dễ dàng thay đổi nguồn dữ liệu khi cần thiết.

3. Dễ dàng kiểm thử: Bằng cách sử dụng Repository Pattern, ta có thể thiết
kế các kế thừa từ một giao diện hoặc lớp trừu tượng và triển khai chúng trong
các lớp giả mạo (mock objects) trong quá trình kiểm thử. Điều này giúp đơn giản
hóa việc kiểm thử độc lập của các phần tử trong hệ thống mà không cần phụ
thuộc vào các nguồn dữ liệu thực tế.

Lợi ích của việc sử dụng Repository Pattern:

1. Tăng tính mô-đun hóa: Repository Pattern giúp tách biệt lớp dữ liệu, giúp
cho việc phát triển và bảo trì ứng dụng trở nên dễ dàng hơn thông qua việc phân
chia các thành phần thành các mô-đun độc lập.

2. Tính dễ mở rộng: Với Repository Pattern, việc thay đổi nguồn dữ liệu
hoặc cách truy cập dữ liệu trở nên dễ dàng hơn. Điều này cho phép tính linh hoạt
và dễ dàng mở rộng hệ thống trong tương lai mà không làm ảnh hưởng đến các
thành phần khác.

3. Tính cô đọng: Sử dụng Repository Pattern giúp giảm thiểu sự trùng lặp
mã và giữ cho logic truy xuất dữ liệu được cô đọng và quản lý tốt hơn. Điều này
dẫn đến mã nguồn dễ đọc, hiểu và bảo trì hơn.

2.Cấu trúc của Repository Pattern

1. Giao diện Repository (Repository Interface): Đây là một giao diện


(interface) định nghĩa các phương thức cần thiết để truy cập và quản lý dữ liệu.
Giao diện này phải cung cấp các phương thức cơ bản như thêm (add), cập nhật
(update), xóa (delete), lấy tất cả (get all), lấy theo ID (get by ID), và có thể bao
gồm các phương thức khác tùy theo yêu cầu của ứng dụng.

2. Triển khai Repository (Repository Implementation): Đây là lớp cụ thể


hoặc nơi triển khai giao diện Repository. Lớp này chịu trách nhiệm xử lý các
hoạt động thực tế trên dữ liệu, bao gồm truy vấn cơ sở dữ liệu, tương tác với hệ
thống tệp tin, hoặc gọi các dịch vụ bên ngoài. Triển khai Repository phải tuân
thủ giao diện Repository và cung cấp các logic xử lý cụ thể.

3. Đối tượng (Object): Đây là đối tượng dữ liệu cần được truy cập và quản
lý thông qua Repository. Đối tượng này có thể là một đối tượng kinh doanh,
một đối tượng giao diện người dùng hoặc bất kỳ đối tượng nào khác mà bạn
muốn lưu trữ hoặc truy xuất dữ liệu.

4. Đối tượng DbContext/EntityManager (Database Context): Đây là đối


tượng quản lý kết nối và tương tác với nguồn dữ liệu. Trong môi trường C#,
thường là DbContext trong Entity Framework hoặc EntityManager trong các
thư viện ORM khác. Đối tượng này được truyền vào triển khai Repository để
thực hiện các hoạt động truy cập dữ liệu thực tế.

5. Dịch vụ kết nối (Connection Service): Đây là dịch vụ hoặc lớp dùng để
cung cấp kết nối tới nguồn dữ liệu. Nó được sử dụng để tạo và cung cấp đối
tượng DbContext/EntityManager cho Repository. Dịch vụ kết nối có thể thực
hiện việc cấu hình kết nối, xử lý lỗi kết nối, và quản lý vòng đời của kết nối.

Qua cấu trúc trên, Repository Pattern giúp tách biệt logic truy cập dữ liệu
(Repository) với logic kinh doanh (đối tượng), tạo ra một lớp trung gian để
giảm sự phụ thuộc và cung cấp khả năng kiểm thử, bảo trì và mở rộng tốt hơn
trong ứng dụng.

3.mô tả cách sử dụng Repository Pattern trong các dự án thực tế

1.Định nghĩa giao diện Repository: Bắt đầu bằng cách định nghĩa một giao diện
(interface) cho Repository, chứa các phương thức cơ bản để truy cập và quản lý
dữ liệu. Ví dụ:

public interface IRepository<T>


{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
IEnumerable<T> GetAll();
T GetById(int id);
}
2.Tiếp theo triển khai giao diện Repository trong một lớp cụ thể. Lớp này sẽ có
logic cụ thể để truy cập và tương tác với nguồn dữ liệu, chẳng hạn như cơ sở dữ
liệu SQL hoặc bất kì nguồn dữ liệu nào khác mà bạn sử dụng. Ví dụ:

public class SQLRepository<T> : IRepository<T>


{
private readonly DbContext dbContext;

public SQLRepository(DbContext dbContext)


{
this.dbContext = dbContext;
}

public void Add(T entity)


{
dbContext.Set<T>().Add(entity);
dbContext.SaveChanges();
}

// Triển khai các phương thức còn lại tương tự


// ...

public IEnumerable<T> GetAll()


{
return dbContext.Set<T>().ToList();
}

public T GetById(int id)


{
return dbContext.Set<T>().Find(id);
}
}
3.Cuối cùng, bạn có thể sử dụng Repository trong code của bạn bằng cách tiếp
tục chấp nhận giao diện Repository và sử dụng đối tượng Repository triển khai
thích hợp. Ví dụ:

public class ProductService


{
private readonly IRepository<Product> productRepository;

public ProductService(IRepository<Product> productRepository)


{
this.productRepository = productRepository;
}

public void AddProduct(Product product)


{
productRepository.Add(product);
}

// Thực hiện các thao tác khác liên quan đến sản phẩm
// ...
}
Lưu ý rằng quá trình triển khai Repository Pattern có thể thay đổi tùy thuộc vào
ngôn ngữ lập trình và công nghệ bạn sử dụng. Điều quan trọng là duy trì nguyên
tắc tách biệt logic truy cập dữ liệu và logic kinh doanh trong ứng dụng.

4.Ưu điểm của Repository Pattern.


 Tách biệt logic truy cập dữ liệu: Repository Pattern giúp tách biệt hoàn
toàn logic truy cập dữ liệu (data access logic) với logic kinh doanh
(business logic) trong ứng dụng. Điều này giúp mã nguồn dễ hiểu, dễ bảo
trì và dễ phát triển do các phần logic được phân tách rõ ràng.
 Tăng tính di động và tái sử dụng: Repository Pattern cho phép bạn thay
đổi công nghệ hoặc nguồn dữ liệu mà không ảnh hưởng đến các lớp logic
kinh doanh. Bạn có thể dễ dàng chuyển đổi giữa các nguồn dữ liệu như
cơ sở dữ liệu SQL, API, bộ nhớ cache, hoặc các dịch vụ lưu trữ dữ liệu
khác mà không cần thay đổi code logic ở nơi sử dụng.
 Dễ dàng kiểm thử và giả lập dữ liệu: Bởi vì logic truy cập dữ liệu được
tách biệt thành các lớp Repository riêng biệt, việc kiểm thử trở nên dễ
dàng hơn. Bạn có thể thay thế các triển khai Repository bằng các triển
khai giả lập hoặc mock để kiểm thử đơn vị và đảm bảo rằng logic kinh
doanh hoạt động chính xác.
 Tích hợp với Dependency Injection (DI): Repository Pattern thường cung
cấp khả năng tích hợp với DI framework như .NET Core's built-in DI
hoặc các DI framework khác. Điều này giúp việc quản lý các phụ thuộc
(dependencies) của Repository trở nên dễ dàng, giảm sự ràng buộc và tạo
khả năng mở rộng tốt hơn cho ứng dụng.
 Cung cấp một lớp trung gian: Repository Pattern cung cấp một lớp trung
gian giữa logic kinh doanh và nguồn dữ liệu. Điều này giúp tăng tính trừu
tượng của ứng dụng, giúp logic kinh doanh không phải quan tâm và phụ
thuộc trực tiếp vào cách truy cập cơ sở dữ liệu hoặc nguồn dữ liệu.

5. Thảo luận về mô hình dữ liệu và cơ sở dữ liệu.

Để triển khai Repository Pattern với các loại cơ sở dữ liệu khác nhau,
bạn có thể tạo ra các interface tương ứng cho từng loại cơ sở dữ liệu. Ví
dụ, nếu bạn muốn triển khai Repository Pattern với MySQL, bạn có thể
tạo ra interface IMySqlRepository và các class tương ứng để thực hiện
các phương thức của interface đó. Tương tự, nếu bạn muốn triển khai
Repository Pattern với MongoDB hoặc SQLite, bạn có thể tạo ra các
interface IMongoDbRepository và ISqliteRepository và các class tương
ứng để thực hiện các phương thức của chúng.

Để thiết kế Repository Pattern với MongoDB, bạn có thể sử dụng thư


viện MongoDB.Driver. Thư viện này cung cấp các lớp để kết nối đến
MongoDB và thực hiện các thao tác truy vấn dữ liệu.

Code minh họa thiết kế Repository Pattern với MongoDB:


Để thiết kế Repository Pattern với MySQL, bạn có thể sử dụng một số
thư viện như Spring Data JPA hoặc Hibernate.

code minh họa thiết kế Repository Pattern với MySQL:


6.Lưu ý và điểm cần lưu ý.

Khi sử dụng Repository Pattern, có một số điểm cần lưu ý mà bạn có


thể chia sẻ. Điều này bao gồm việc quản lý các phụ thuộc, quy mô và phù
hợp trong việc triển khai Repository Pattern.

Khi sử dụng repository pattern, bạn cần lưu ý các điểm sau:

1. Quản lý phụ thuộc: Repository pattern giúp tách biệt việc truy cập cơ
sở dữ liệu khỏi lớp logic của ứng dụng. Tuy nhiên, bạn cần chắc chắn
rằng các phụ thuộc giữa các lớp được quản lý một cách rõ ràng và không
có sự phụ thuộc lẫn nhau không cần thiết.
2. Quy mô: Repository pattern thích hợp cho các ứng dụng có quy mô lớn
và có nhiều thao tác với cơ sở dữ liệu. Nếu ứng dụng của bạn quá nhỏ và
chỉ có một số ít câu truy vấn đơn giản, việc triển khai repository pattern
có thể là một sự rườm rà không cần thiết.

3. Phù hợp: Repository pattern không phải lúc nào cũng phù hợp cho tất
cả các tình huống. Bạn cần xem xét cẩn thận và đánh giá xem liệu việc
triển khai repository pattern có thực sự giúp tạo ra sự trừu tượng và linh
hoạt hay không. Đôi khi, việc sử dụng các lớp dịch vụ trực tiếp để truy
cập cơ sở dữ liệu có thể đủ để đáp ứng yêu cầu của ứng dụng.

4. Hiệu suất: Repository pattern có thể có ảnh hưởng đến hiệu suất của
ứng dụng. Nếu bạn không quản lý tốt việc truy vấn và cache dữ liệu, việc
sử dụng repository pattern có thể làm tăng độ trễ và giảm hiệu suất.

5. Tách biệt logic: Một trong những mục tiêu chính của repository pattern
là tách biệt logic của ứng dụng và truy cập cơ sở dữ liệu. Điều này giúp
dễ dàng thay đổi và kiểm thử logic mà không cần bận tâm đến cơ sở dữ
liệu. Tuy nhiên, bạn cần đảm bảo rằng sự tách biệt này đúng mức, không
làm mất đi tính hiệu quả hoặc gây ra sự phức tạp không cần thiết.

7.Tổng Kết.
Tổng kết lại, Repository Pattern là một mô hình quản lý truy cập dữ liệu linh
hoạt, giúp tách biệt và tái sử dụng mã nguồn, tăng tính di động và testability của
ứng dụng, và giúp phát triển ứng dụng một cách có cấu trúc và bảo trì tốt hơn.

You might also like