Khoanglang89
Bạn hãy đăng nhập hoặc đăng ký
Khoanglang89

NHẬN THIẾT KẾ WEBSITE/ SOFTWARE - LÀM ĐỒ ÁN TỐT NGHIỆP, ĐỒ ÁN CHUYÊN MÔN NGÀNH CÔNG NGHỆ THÔNG TIN


You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

Admin

avatar

Admin
Admin
Loading

[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 Smile) (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

1 2 3 4 5 6 7 8 9 public interface IGenericRepository where T : class

{

IEnumerable SelectAll();

T SelectById(object id);

void Insert(T obj);

void Update(T obj);

void Delete(object id);

void Save();

}
view raw repository-interface.cs hosted with ❤ by GitHub
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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 public class GenericRepository : IGenericRepository where T : class

{

protected ApplicationDbContext _db { get; set; }

protected DbSet _table = null;

 

public GenericRepository()

{

_db = new ApplicationDbContext();

_table = _db.Set();

}



public GenericRepository(ApplicationDbContext db)

{

_db = db;

_table = _db.Set();

}



public IEnumerable SelectAll()

{

//return _table.AsNoTracking().ToList();

return _table.ToList();

}



public T SelectById(object id)

{

try

{

return _table.Find(id);

}

catch

{

return null;

}

}



public void Insert(T obj)

{

_table.Add(obj);

}



public void Update(T obj)

{

_table.Attach(obj);

_db.Entry(obj).State = EntityState.Modified;

}



public void Delete(object id)

{

T existing = _table.Find(id);

_table.Remove(existing);

}



public void Save()

{

_db.SaveChanges();

}

}
view raw generic-repo.cs hosted with ❤ by GitHub
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:

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:
1 2 3 4 5 6 7 8 9 10 11 12 13 public class StudentRepository : GenericRepository

{

public List Search(string name)

{

if (string.isNullOrEmpty(name)) return null;



var students = this.SelectAll().ToList();

 

var search = students.Where(s => s.Name.ToLower().Contains(name.ToLower())).ToList();

 

return search;

}

}
view raw student-repo.cs hosted with ❤ by GitHub
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ụ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 public class StudentController : Controller

{

private StudentRepository _studentRepo = new StudentRepository();



public ActionResult Index()

{

var students = _studentRepo.SelectAll().ToList();



return View(students);

}



[HttpPost]

public ActionResult Insert(Student student)

{

if (!ModelState.IsValid)

{

// todo

}



try

{

_studentRepo.Insert(student);

_studentRepo.Save();

}

catch (Exception)

{

// todo

}



return RedirectToAction("Index");

}



[HttpPost]

public ActionResult Update(Student student)

{

if (!ModelState.IsValid)

{

// todo

}



try

{

_studentRepo.Update(student);

_studentRepo.Save();

}

catch (Exception)

{

// todo

}



return RedirectToAction("Index");

}



public ActionResult Delete(int? id)

{

if (!ModelState.IsValid)

{

// todo

}



try

{

_studentRepo.Delete(id);

_studentRepo.Save();

}

catch (Exception)

{

// todo

}



return RedirectToAction("Index");

}

}
view raw repo-student-controller.cs hosted with ❤ by GitHub

Đá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 =)).


_________________
Có nỗi buồn triền miên, làm trái tim hoá đá
Có những dòng lệ nhỏ, khiến đá hoá thành tim.

-------------------------------------------------------------------------------------------------------
Program Skills:  ASP.Net MVC 3/4; C#; VB.Net/ VB 6.0; Java Applet/Swing; JS/JavaScript; Bootstrap/ AngularJS; HTML/CSS; Turbo C/ Turbo C++; Pascal...
Xem mẫu Phần mêm quản lý ở đây     -           Xem mẫu Bán hàng trực tuyến ở đây
Nguyễn Ích Hoàn
new_life02081989@yahoo.com
nguyenichhoan1989@gmail.com
Xem lý lịch thành viên http://khoanglang89.forumvi.com

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Bài viết mới cùng chuyên mục

      Permissions in this forum:
      Bạn không có quyền trả lời bài viết