Gọi hàm tạo lớp cơ sở một cách rõ ràng là cách duy nhất để thực hiện việc này bằng cách sử dụng phép dựng hàm dựng trong C#. Có vẻ như bạn nên loại bỏ các nhà xây dựng không có tham số từ BaseController
và PublicController
vì chúng không bao giờ thực sự được gọi khi có trình ghi nhật ký.
Vấn đề tiêm phụ thuộc vào bộ điều khiển cơ sở là vấn đề phổ biến khi sử dụng ASP.NET MVC và IoC. Có nhiều lựa chọn/trường phái tư tưởng.
1.) Sử dụng dịch vụ tổng hợp. Để duy trì các hàm tạo lớp dẫn xuất đơn giản, hãy tạo một dịch vụ đơn lẻ hiển thị hoặc ủy quyền cho tất cả các dịch vụ khác nhau cần thiết bởi bộ điều khiển cơ sở (ví dụ: IBaseControllerDependencies
hoặc tương tự.) Sau đó chuyển dịch vụ này tới BaseController
giống như bạn đang làm với ILogger
tại đây.
Có nhiều ưu điểm khác nhau tùy thuộc vào ứng dụng của bạn và số lượng lớp cơ sở bạn đang sử dụng.Google cho 'dịch vụ tổng hợp Autofac' để xem thêm về điều này.
2.) Sử dụng tính năng tiêm thuộc tính. Tận dụng tối ILogger
tài sản trên public class cơ sở của bạn, và cấu hình chai lọ bằng:
builder.RegisterControllers().PropertiesAutowired();
tiêm tài sản là không thực sự là một kỹ thuật được ưa chuộng trong Autofac. Vai trò của nhà xây dựng là để chấp nhận các phụ thuộc, trong khi các thuộc tính có thể ghi được thường được xem như là một mùi mã, vì vậy Autofac không thực sự tối ưu hóa cho trường hợp này. Một trong những hạn chế là các thuộc tính có thể ghi được rằng không nên được tiêm thường là nhầm lẫn, với những hậu quả kỳ lạ.
3.) Chức năng điều khiển cơ sở Refactor thành nhiều bộ lọc hành động khác nhau. Autofac có thể đưa các bộ lọc hành động vào đường dẫn gọi hành động MVC. Do đó, các bộ lọc có thể lấy các phụ thuộc nằm trong lớp cơ sở và các mối quan tâm tương tự có thể được áp dụng theo cách cắt ngang. Thông tin thêm về điều này trên web, ExtensibleActionInvoker
và .InjectActionInvoker()
trỏ đến thông tin bạn cần. Không phải luôn luôn có thể với tất cả các mối quan tâm.
4, cũng là câu trả lời cho câu hỏi thứ hai của bạn.) Giải quyết các phụ thuộc bộ điều khiển cơ sở sử dụng vị trí dịch vụ từ DependencyResolver.Current
.
var logger = DependencyResolver.Current.GetService<ILogger>();
Lý do không được khuyến khích là nó làm cho ứng dụng kết quả khó hiểu hơn vì không còn khả năng xem dịch vụ phụ thuộc vào thành phần nào. những gì phải được cấu hình trong container trước khi một thành phần cụ thể có thể được sử dụng, người ta phải xem xét toàn bộ codebase của thành phần để tìm các cuộc gọi GetService()
. Một trở ngại đáng chú ý khi thử nghiệm đơn vị.
Hy vọng điều này sẽ giúp ích cho bạn, một chút về kết xuất não tôi biết :) Những người khác có thể thêm một số ý tưởng vào những thứ này.