Định nghĩa
Chúng tôi có 3 giao diện: ILogger
, ILoggerProvider
và ILoggerFactory
. Hãy xem mã nguồn để tìm ra trách nhiệm của chúng:
ILogger : chịu trách nhiệm viết thông báo nhật ký của một Cấp độ nhật ký nhất định .
ILoggerProvider : chịu trách nhiệm tạo một phiên bản của ILogger
(bạn không được phép sử dụng ILoggerProvider
trực tiếp để tạo trình ghi nhật ký)
ILoggerFactory : bạn có thể đăng ký một hoặc nhiều ILoggerProvider
s với nhà máy, lần lượt sử dụng tất cả chúng để tạo một phiên bản của ILogger
. ILoggerFactory
giữ một bộ sưu tập của ILoggerProviders
.
Trong ví dụ dưới đây, chúng tôi đang đăng ký 2 nhà cung cấp (bảng điều khiển và tệp) với nhà máy. Khi chúng tôi tạo một trình ghi nhật ký, nhà máy sử dụng cả hai nhà cung cấp này để tạo một phiên bản của trình ghi nhật ký:
ILoggerFactory factory = new LoggerFactory().AddConsole(); // add console provider
factory.AddProvider(new LoggerFileProvider("c:\\log.txt")); // add file provider
Logger logger = factory.CreateLogger(); // <-- creates a console logger and a file logger
Vì vậy, bản thân trình ghi nhật ký đang duy trì một tập hợp các ILogger
s, và nó viết thông điệp nhật ký cho tất cả chúng. Nhìn vào mã nguồn Logger, chúng ta có thể xác nhận rằng Logger
có một mảng ILoggers
(tức là LoggerInformation[]
), đồng thời nó đang triển khai ILogger
giao diện.
Tiêm phụ thuộc
Tài liệu MS cung cấp 2 phương pháp để đưa vào trình ghi nhật ký:
1. Tiêm cho nhà máy:
public TodoController(ITodoRepository todoRepository, ILoggerFactory logger)
{
_todoRepository = todoRepository;
_logger = logger.CreateLogger("TodoApi.Controllers.TodoController");
}
tạo Logger với Category = TodoApi.Controllers.TodoController .
2. Tiêm thuốc chung ILogger<T>
:
public TodoController(ITodoRepository todoRepository, ILogger<TodoController> logger)
{
_todoRepository = todoRepository;
_logger = logger;
}
tạo một trình ghi nhật ký với Category = tên loại đủ điều kiện của TodoController
Theo tôi, điều làm cho tài liệu khó hiểu là nó không đề cập bất cứ điều gì về việc tiêm thuốc không chung chung , ILogger
. Trong cùng một ví dụ ở trên, chúng ta đang tiêm một loại không chung chung ITodoRepository
và nó không giải thích tại sao chúng ta không làm như vậy đối với ILogger
.
Theo Mark Seemann :
Một Injection Constructor không nên làm gì nhiều hơn là nhận các phụ thuộc.
Đưa một nhà máy vào Bộ điều khiển không phải là một cách tiếp cận tốt, vì Bộ điều khiển không có trách nhiệm khởi tạo Bộ ghi (vi phạm SRP). Đồng thời việc tiêm một loại thuốc chung ILogger<T>
làm tăng thêm tiếng ồn không cần thiết. Xem blog của Simple Injector để biết thêm chi tiết: Có gì sai với sự trừu tượng của ASP.NET Core DI?
Những gì nên được đưa vào (ít nhất là theo bài viết trên) là một thứ không chung chung ILogger
, nhưng sau đó, đó không phải là thứ mà Bộ chứa DI tích hợp của Microsoft có thể làm và bạn cần sử dụng Thư viện DI của bên thứ ba. Những hai tài liệu giải thích làm thế nào bạn có thể sử dụng thư viện của bên thứ 3 với NET Core.
Đây là một bài báo khác của Nikola Malovic, trong đó ông giải thích 5 định luật IoC của mình.
Định luật IoC thứ 4 của Nikola
Mọi phương thức khởi tạo của một lớp đang được giải quyết không được có bất kỳ triển khai nào khác ngoài việc chấp nhận một tập các phụ thuộc của chính nó.