2009-07-21 27 views
9

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

9

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

+0

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

+1

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

5

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(); 
    } 
} 
+0

wow, cảm ơn, sẽ dùng thử ngay lập tức! –

+0

hoạt động như sự quyến rũ! Cảm ơn bạn! –

Các vấn đề liên quan