Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Khi nào dùng Transient, Singleton và Scoped trong Dependency Injection

11:58 19-10-2021 5.287 lượt xem 0 bình luận

Xin chào các anh chị ạ.

Em có đang tìm hiều về Dependency Injection thì em có biết DI hỗ trợ 3 vòng đời chính là Transient, Singleton và Scoped :

Khái niệm cửa từng cái thì em hiểu rồi ạ

Nhưng em vẫn chưa rõ là khi áp dụng vào dự án thực tế thì những trường hợp nào thì nên dùng những cái nào ạ

Mong anh chị chỉ giáo giúp em với ạ

Em xin cảm ơn ạ

Câu Hỏi Của Bạn Đi Tìm Niềm Vui

Câu Trả Lời Của Bạn Trương Quốc Khánh
 

Dựa trên vòng đời mà triển thôi.

-Scoped dùng cho database.

-Cần chạy liên tục thì Singleton như signalr.

-Sử dụng ít/nhẹ thì Transient như gửi mail

Câu Trả Lời Của Bạn Kou Tsuneka
 

Trước hết bạn phải hiểu khái niệm lifetime và ownership.

lifetime bắt đầu khi bạn khởi tạo new hay khởi tạo trên scope stack, kết thúc khi ra khỏi scope hay delete hay không đc reference nữa (tùy ngôn ngữ). ownership là sở hữu nói đến đối tượng/hàm/(thread?) chịu trách nhiệm giải phóng tài nguyên bị sở hữu.

Trong C# dùng garbage collector nên ownership được share, trách nhiệm giải phóng do là do GC khi đối tượng không còn được reference.

Singleton, đối tượng (instance) được inject chỉ được khởi tạo một lần, khi inject sẽ inject reference (con trỏ, C# reference) đến đối tượng đó, không khởi tạo thêm instance mới.

Transient mỗi lần inject sẽ tạo một instance mới.

Scoped, cái này cụ thể với http??, mỗi request sẽ tạo một instance mới, inject instance đó nếu cùng một lần request.

Tùy trường hợp mà áp dụng thôi. Bạn hiểu/thiết kế được đối tượng đó cần sống lâu như thế nào thì triển khai như thế, tùy thuộc vào framework. DI không phải chỉ của ASP .NET nên mình không nói riêng ASP. Trường hợp những cái có sẵn thì nó sẽ có yêu cầu lifetime cụ thể, bạn làm theo là được, còn nếu service/object bạn tự viết thì tùy bạn thiết kế theo mục đích của bạn.

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

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