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
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.