Tôi muốn tiêm ILog vào các lớp của tôi, không phải là ILoggerFactoryAdapter, nhưng ILoggerFactoryAdapter cần tên của lớp gọi (lớp muốn đăng nhập cái gì đó, vì vậy tôi có thể phân loại đúng) để Autofac có thể xác định lớp nào đang yêu cầu ILog và tự động tạo ILog từ nhà máy?Nhà máy tự động với Common.Logging và Autofac?
Trả lời
Bailey Ling đã đưa ra một cách tiếp cận tuyệt vời mà không sử dụng ngăn xếp đi bộ - xem bài đăng ở đây: http://groups.google.com/group/autofac/msg/704f926779cbe8b3
Tôi cũng đã cố gắng thực hiện điều này, nhưng tôi không thể tìm cách truy cập vào kích hoạt của autofac (không vá nó) để đến kiểu được tiêm với cá thể logger.
Dưới đây là "hoạt động trên máy của tôi" cách chứng nhận (Autofac-1.4.3.536)
protected override void Load(ContainerBuilder builder)
{
const string loggerName = "Logger.Name";
builder.
Register((c, p) => LogManager.GetLogger(p.Named<string>(loggerName))).
OnPreparing((c, p) =>
{
var stack = p.Context.GetActivationStack();
var requestingType = "default";
if (stack != null && stack.Length > 1) requestingType = stack[1].Description;
var parameters = new List<Parameter>(p.Parameters) { new NamedParameter(loggerName, requestingType) };
p.Parameters = parameters;
}).
FactoryScoped();
}
static class ContextExtensions
{
public static Autofac.Service[] GetActivationStack(this Autofac.IContext context)
{
const string notSupportedMessage = "GetActivationStack not supported for this context.";
var type = context.GetType();
if (type.FullName != "Autofac.Context") throw new NotSupportedException(notSupportedMessage);
var field = type.GetField("_componentResolutionStack", BindingFlags.Instance | BindingFlags.NonPublic);
if (field == null) throw new NotSupportedException(notSupportedMessage);
var activationStack = field.GetValue(context) as Stack<Autofac.Service>;
if (activationStack == null) throw new NotSupportedException(notSupportedMessage);
return activationStack.ToArray();
}
}
wow, cảm ơn, sẽ dùng thử ngay lập tức! –
hoạt động như sự quyến rũ! Cảm ơn bạn! –
- 1. Thay thế nhà máy với AutoFac
- 2. Common.Logging với nhiều bộ điều hợp nhà máy
- 3. Đăng ký nhà máy tự động
- 4. Caliburn.Micro. Tự động gọi eventaggregator.Subscribe() cho implementors IHandle với Autofac
- 5. Làm thế nào để tiêm một nhà máy của các loại chung với Autofac
- 6. Ninject có hỗ trợ Func (nhà máy được tạo tự động) không?
- 7. Autofac có thể tự động ràng buộc không?
- 8. Đối tượng nhà máy và chức năng của nhà máy
- 9. Lựa chọn nhà khai thác tham số Autofac
- 10. Nhà máy ủy quyền của Autofac bằng cách sử dụng func <>
- 11. Máy tự động và bất biến
- 12. Lỗi nhà máy trùng lặp với rspec và nhà máy nữ?
- 13. Capybara không hoạt động với nhà máy nữ
- 14. Tích hợp Autofac và Quartz.Net
- 15. Thời gian hoạt động của Autofac và Nhà cung cấp mặc định trong Phạm vi thời gian phù hợp
- 16. Common.Logging cấu hình ngoại lệ
- 17. Autofac và IDisposable interface
- 18. IoC (Ninject) và Nhà máy
- 19. IoC, nhà máy và đối số hàm tạo
- 20. Sử dụng autofac với moq
- 21. Autofac và Cross-AppDomain Proxies
- 22. Autofac - Lifetime và các module
- 23. nối tự đăng ký lại, trừu tượng nhà máy
- 24. Tự động hóa nhà trong C#?
- 25. Nhà máy bên trong và bên ngoài
- 26. Đăng ký nhà máy tự động biên dịch các mẫu lớp trong C++
- 27. Lưu dữ liệu với mẫu nhà máy?
- 28. Nhà máy/Nhà máy trừu tượng nhầm lẫn
- 29. Autofac và ASP.NET Web API ApiController
- 30. Nhà cung cấp tự động trong triển khai web (msdeploy.exe)
Giải pháp của Bailey là tuyệt vời, nhưng nó không hoạt động với tích hợp WebForms. Các trang và điều khiển người dùng không được đăng ký, do đó trình xử lý sự kiện không bao giờ kích hoạt. Có một bình luận trên trang wiki của dự án Autofac có cùng tác dụng (http://code.google.com/p/autofac/wiki/Log4NetIntegration). –
Mã này hơi lỗi thời, nhưng may mắn thay Autofac đã chuyển nó thành một ví dụ chính thức: http://docs.autofac.org/en/latest/examples/log4net.html – Mugen