Bài viết

Kho tài liệu và bài viết được chia sẻ, đánh giá bởi cộng đồng

Kỹ thuật sử dụng Dependency Injection trong Winform project - Winform never die

skynet đã tạo 4 năm trước Hoạt động 4 năm trước 6.497 lượt xem 10 bình luận

DẪN NHẬP

Trước khi đi vào code mẫu của DI trong Winform mình cùng tìm hiểu xem DI là gì và vì sao các lập trình viên lại đam mê đến thế.

Định nghĩa có thể sẽ gây khó hiểu, vì thực sự cũng chưa biết định nghĩa nào mới là chuẩn, nhưng mình sẽ miêu tả dựa trên nhu cầu:

DI là kỹ thuật được sử dụng Nếu “bạn có thứ gì đó muốn khai báo một lần, sử dụng ở nhiều nơi”.

Như vậy nhiều bạn có thể nói: Tôi tạo singleton ở static class cũng được, chỉ một lần khai báo cũng sài được ở nhiều nơi.

Điều ấy đúng, nhưng chưa tiện, vì sao tôi nói vậy?

Giả sử bạn có 1 class cần sử dụng nhiều Service:

Để dùng được Service B, C..Z cần làm gì? Lại truyền từ ngoài vào, hay sẽ dùng constructor để set giá trị khởi tạo. Chưa kể các Service có thể cần (phụ thuộc vào) nhiều, nhiều tham số hoặc các Service có liên quan khác nữa (nhũn não nếu như bạn có hàng tá Service có họ hàng – quan hệ nhập nhằng với nhau - bạn sẽ phải sửa rất nhiều code nếu có sự thay đổi với 1 đối tượng service nào đó).

Lúc này, DI sẽ tỏ rõ được vị thế sức mạnh của mình khi tự động TIÊM tất cả những thứ mà chương trình cần để chạy được;

Để có thể tự động TIÊM một thứ gì đó, code cần được triển khai dạng constructor-parameters (tham số truyền vào thông qua constructor) và phải đảm bảo Quy trình 3 bước như sau đây: điều động các biến làm việc như cán bộ vậy (^_^)

  1. Khai báo thứ muốn truyền vào thông qua Constructor
  2. Có 01 field để Hứng dữ liệu đã được truyền vào
  3. Sử dụng nó thôi.

Ví dụ:

 

+ Nghe hấp dẫn rồi đấy, nhưng đoạn code trên đã hoạt động hay chưa?

- Chưa đâu, cần có HOST để thực hiện công việc tự động TIÊM mọi thứ khi cần dùng nữa.

 

Các kỹ thuật ở bài này có thể sử dụng một phần hoặc hoàn toàn ở các dự án console, wpf hoặc asp.net khác.

Đặc biệt là cách dùng Serilog, SQLite, chạy lệnh EF như: add-migration, update-database có thể tái sử dụng ở mọi dự án .NetCore khác.

Bài này giờ mới vào phần chính, cả nhà nhớ ăn uống đầy đủ, kẻo tụt huyết áp học ko vào nhé! =]]

Thứ tự các bước như sau nè:

1. Tạo mới Winform project (.NET CORE - Chọn luôn 5.0 cho mới)

- Chạy visual studio => chọn new project => tìm dự án winform (.Net Core hoặc .Net - không có chữ framework).

- Này tự làm nhé ^_^!

2. Cài các Thư viện có liên quan

- DBContext

"Microsoft.EntityFrameworkCore"                 Version="5.0.9"

- UseSQLite()
"Microsoft.EntityFrameworkCore.Sqlite"          Version="5.0.9"

- Add-Migration; Update-database
"Microsoft.EntityFrameworkCore.Tools"           Version="5.0.9"

--Để dùng IHOST (nơi khởi nguồn DI)
"Microsoft.Extensions.Hosting"                  Version="5.0.0"

--Này như trên (mình ko hiểu)
"Microsoft.Extensions.Hosting.Abstractions"     Version="5.0.0"

--UserSerilog()
"Serilog"                                       Version="2.10.0"

--UserSerilog()
"Serilog.Extensions.Hosting"                    Version="4.1.2"

--WriteTo.File()
"Serilog.Sinks.File"                            Version="5.0.0"

--WriteTo.SQLite()
"Serilog.Sinks.SQLite"                          Version="5.0.0"

3. Khai báo HOST

- Khai báo Host này ở chỗ nào cũng được, miễn là nó static readonly (khởi tạo một lần duy nhất & không thể chỉnh sửa trong suốt quá trình app chạy).

* Sau này tất cả mọi thứ cần tự động TIÊM sẽ được khai báo trong cái Host này

ví dụ:

- services.AddSingleton<ServiceA>(); //Chỗ nào cần ServiceA thì truyền cho nó 1 cái (Singleton thì cả chương trình chỉ có 1)

- services.AddScoped<ServiceA>(); //Mỗi constructor gọi ServiceA sẽ nhận được một cái khác nhau.

- services.AddTransient<ServiceA>(); //Cứ hễ ServiceA được sử dụng đến là sẽ được tạo mới

(đoạn này mình hiểu vậy, sai xin anh em comment giúp)


4. Sử dụng HOST trong Program

Ok rồi, sử dụng thực tế nè:

5. (optional) Tạo Thêm AppContext Customer để lưu thử dữ liệu nữa!

optional nghĩa là tạo hoặc không đều được, nếu bạn không có nhu cầu sử dụng db thì bỏ qua bước này và xoá tất cả lệnh có chứa AppContext hoặc context đi; và ứng dụng có thể chạy bình thường rồi.

Nếu có sử dụng db (trong bài này là SQLite) thì cần khai báo các thứ sau:

Khai báo AppContext và AppContextFactory (trùng lặp sao? không phải đâu, winform 5.0 nó phải khai báo 2 lần lận, cả trong host và ở đây, dị vậy đó)

Chạy nha?

Ok làm xong bước 6 là chạy được

6. (required if 5) Mở package console manager lên để chạy lệnh

Add-migration init       (tạo migration có tên là Init)

Update-Database       (cập nhật vào db là sqlite file)

*một số lưu ý

- Xem code mẫu  file nằm ở đây

- Do giới hạn của winform (chắc thế) lệnh Update-Database có thể báo lỗi, nhưng nó tạo file xong, là ok dùng tốt! ^_^!

BÀI CHƯA ĐẦY ĐỦ, ANH EM GÓP Ý MÌNH SẼ SỬA ĐỂ LÀM TÀI LIỆU VỀ LÂU DÀI CHO CÁC NEWBIE NHÉ!

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
thuongit2110 đã bình luận 3 năm trước

like

Cu Xin Author đã bình luận 4 năm trước

Bài viết nội dung thì được đó. Nhưng trình bày nhìn nó cứ rối rối với không theo cái nguyên tắc gì cả. Người đọc như mình thì vào thì toàn nhìn thấy gạch ngang, viết hoa, rồi văn nói đặt lung tung.

Nói chung nội dung hay, nhưng trình bày quá tệ.

hoanganh9192 đã bình luận 4 năm trước

ui, tuyệt quá! cảm ơn a

K9 SuperAdmin, KquizAdmin, KquizAuthor đã bình luận 4 năm trước

hay nè. viết thêm nữa đi bạn

Câu hỏi mới nhất