2008-10-29 25 views
10

Tôi khá mới đến lâu đài Windsor và đang nhìn vào trong và ngoài của cơ sở khai thác gỗ. Nó có vẻ khá ấn tượng nhưng điều duy nhất tôi không thể làm việc ra là nơi Windsor đặt tài sản Logger trên lớp học của tôi. Như trong đoạn mã sau sẽ đặt Logger thành nullLogger nếu lớp chưa được thiết lập nhưng khi Resolve kết thúc chạy thuộc tính Logger được thiết lập.Nơi & Làm thế nào Castle Windsor thiết lập cơ sở khai thác gỗ

private ILogger logger; 

public ILogger Logger 
{ 
    get 
    { 
     if (logger == null) 
      logger = NullLogger.Instance; 
     return logger; 
    } 
    set { logger = value; } 
} 

Vì vậy, những gì tôi tự hỏi là làm thế nào và nơi windsor đặt thuộc tính Logger của tôi.

Cheers Anthony

Trả lời

12

Các logger được thiết lập bởi các cơ sở khai thác gỗ, mà là ở phần <facilities> của cấu hình. Ví dụ sử dụng log4net ứng dụng hoặc web.config của bạn sẽ trông như thế này:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> 
    </configSections> 
<Configuration> 

<castle> 

    <facilities> 
     <facility id="loggingfacility" 
      type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
      loggingApi="log4net" 
      configFile="logging.config" /> 
    </facilities> 

</castle> 
</configuration> 
1

Vì bạn có một tài sản công cộng với một Setter, mỗi khi bạn giải quyết đối tượng của bạn từ Windsor, nó cũng sẽ cố gắng thiết lập bất kỳ tài sản công cộng với các giá trị thích hợp từ container (trong trường hợp của bạn, một ILogger mà cơ sở của bạn sẽ cư trú vào Windsor).

Có nghĩa là, nếu bạn giải quyết Lớp học từ Windsor, điều này sẽ được đặt. Nhưng không phải nếu bạn làm lớp mới().

Ít nhất tôi hiểu điều đó như thế nào.

Phương pháp khác là sử dụng nhà thầu, có nghĩa là nếu bạn có một constructor tên

lớp công cộng (ILogger logger) nó sẽ được khởi tạo với ILogger như một tham số.

Ví dụ:

 

var yourClassObject = Kernel.Resolve<IClass>(); 

NẾU bạn không có một đặc điểm kỹ thuật giao diện (và đăng ký như vậy), bạn sẽ cần phải đăng ký thành phần của bạn như các loại bê tông nếu bạn muốn giải quyết nó bằng cách sử rằng loại bê tông (và không phải bởi giao diện).

+0

Tôi ước mình có thể xem ví dụ về cách giải quyết lớp từ vùng chứa tại đây. – OutOFTouch

+0

Đã thêm một ví dụ đơn giản. – jishi

+0

Cảm ơn bạn, Điều này xác nhận với tôi rằng tôi đã hiểu những gì bạn đang nói. – OutOFTouch

11

Bạn cũng có thể cấu hình này programatically khi bạn khởi windsor (ví dụ như từ global.asax.cs của bạn):

container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net)); 

Bạn có thể dĩ nhiên chọn bất kỳ implimentations logger.

Điều này sẽ được kết nối bất cứ khi nào windsor instantiates bất kỳ lớp mong đợi một logger. Tôi sẽ không đặt điều này trong các nhà xây dựng vì nó là một mối quan tâm cắt ngang - tốt hơn để làm như bạn đề xuất trong quan điểm của tôi. Bạn có thể đơn giản hóa nó một chút:

private ILogger logger = NullLogger.Instance; 
    public ILogger Logger 
    { 
     get { return logger; } 
     set { logger = value; } 
    } 
+1

Bộ thu không cần thiết. Lý do duy nhất mà thuộc tính này tồn tại là để Windsor có thể ghi đè lên trình ghi rỗng mặc định. – IanT8

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