2011-04-28 83 views
4

在LoggingFacility文檔(http://docs.castleproject.org/Windsor.Logging-Facility.ashx)的聲明如下:城堡LoggingFacility

「允許你問一個ILoggerFactory實例提供日誌記錄支持到不受溫莎管理的課程「

但是我如何確實要求一個ILoggerFactory實例,如果我的課程不是由Windsor管理的?

TIA

瑟倫

繼續說道:

我很新的使用溫莎(IOC),所以當你說「爲什麼你會不會有溫莎類經理」我開始想知道你是否說所有的班級都應該由溫莎管理...

我正在研究一些遺留代碼,並且已經在其上創建了一個服務接口......類似於:

namespace RESTServer.WindsorTestService 
{ 
[ServiceContract(Namespace = "urn: RESTServer_WindsorTestService:IMyServiceClass")] 
    public interface IMyServiceClass 
    { 
     ILogger Logger // Will be injected by Windsor 
     { get; set; } 

     [OperationContract] 
     [WebGet(UriTemplate = "MyMethod")] 
     int MyServiceMethod(); 
    } 

    [AspNetCompatibilityRequirements(RequirementsMode =  AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class MyServiceClass : IMyServiceClass 
    { 
     private ILogger _logger = NullLogger.Instance; 

     public ILogger Logger // Will be injected by Windsor 
     { 
      get { return _logger; } 
      set { _logger = value; } 
     } 

     public int MyServiceMethod() 
     { 
      // ... which will populate val1, val2, val3 
      var val1 = 1; 
      var val2 = 10; 
      var val3 = 100; 

      var myCalc = new myLegacyClass(val1, val2, val3); 
      return myCalc.DoCalculate(1000); 
     } 
    } 

    public class myLegacyClass 
    { 
     private int _val1; 
     private int _val2; 
     private int _val3; 

     private static readonly ILog _logger = LogManager.GetLogger(typeof(myLegacyClass)); 

     public myLegacyClass(int val1, int val2, int val3) 
     { 
      _val1 = val1; 
      _val2 = val2; 
      _val3 = val3; 
     } 

     public int DoCalculate(int val4) 
     { 
      _logger.Info("Doing some calculation"); 
      return _val1 + _val2 + _val3; 
     } 
    } 
} 

其中遺留代碼已經使用log4net ....它工作正常,但我想知道如果myLegacyClass應該改變,以某種方式從溫莎獲取記錄器...我只是不知道什麼是最好的方式將.....

TIA 瑟倫

回答

1

當然使用LoggingFacility的一點是讓你的日誌要求由溫莎的配置滿足你的組件並不關心是什麼用記錄儀(如果任何?!)

傑克夏洛龍在這裏有一個很好的介紹

http://devlicio.us/blogs/casey/archive/2008/06/18/logging-with-castle-windsor-the-logging-facility-and-log4net.aspx

它展示瞭如何使用可選屬性依賴注入來獲得一個記錄器實例。

如果您必須從未通過Windsor容器創建的組件獲取ILogger的句柄,那麼您可以使用配置爲與Windsor容器交談的ServiceLocator(例如Microsoft.Practices.ServiceLocation)並獲取就這樣。

var logger = ServiceLocator.Current.GetInstance(typeof(ILogger)) as ILogger

的ServiceLocator是相當的碼氣味壽」和如果可能的話,應避免 - 同上直接使用溫莎容器。

+0

問題是myLegacyClass不是由Windsor管理的(因爲可能是很好的原因)。過去我做了一些醜陋的事情,但是我沒有使用ILogger,而是執行了以下操作:ServiceLocator.Current.GetInstance(typeof(ILoggerFactory))。然後在工廠調用.Create(Type)...非常混亂和醜陋。當我遇到舊的舊類問題時,我最終直接使用log4net。 – Kevin 2013-02-21 21:42:10

3

container.Resolve<ILoggerFactory>()並且您管理工廠並自行採集記錄器。問題在於 - 爲什麼你不會有溫莎的班主任?

0

問題被問到「你爲什麼沒有溫莎管理班」。沒有聲稱是DI/IOC的專家,但我的理解是,您的域名類例如模型通常不會由DI/IOC管理。但是,如果您的某個Domain Classes需要執行某些日誌記錄,那麼它需要使用ILogger。

我一直在問同樣的問題,因爲兩個解決方案都標有可能的代碼味道,我想知道是否有更清潔的解決方案。

0

要回答這個問題,這是我在過去所做的那樣:

var factory = ServiceLocator.Current.GetInstance<ILoggerFactory> 
var logger = factory.Create(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

這將讓你所需要的,但話又說回來,這也比直接在這些情況下引用log4net的更好。

當使用IoC和處理遺留類時,它有時會變得很痛苦。