2011-11-08 28 views
5

Tôi có một thư viện lớp trong C# và nó thực hiện rất nhiều chức năng khác nhau cho tôi. Tôi muốn có thể đăng nhập trong suốt lớp, tuy nhiên, tôi thực sự không muốn phải vượt qua các thể hiện của thư viện đăng nhập trong suốt.Ghi nhật ký trong toàn bộ thư viện lớp mà không có tài liệu tham khảo vượt qua

ví dụ:

public void MyMethod(LoggingClass logger) 
{ 
    logger.log("something"); 
} 

public void MyMehtod2(LoggingClass logger) 
{ 
    logger.log("something else"); 
} 

Tôi có các lớp học ở khắp mọi nơi trong thư viện này và đang vật lộn với cách tốt để làm điều này. Tôi đã nhìn vào tiêm phụ thuộc với Ninject, nhưng dường như không thể có được đầu của tôi xung quanh như thế nào nên làm việc.

Vì vậy, để tóm tắt, tôi muốn có thể có một lớp đăng nhập, và có thể nhanh chóng nó một lần, sau đó sử dụng nó ở khắp mọi nơi để đăng nhập.

Trả lời

5

Tôi không thấy nhu cầu về singleton. Chỉ cần sử dụng lớp tĩnh trong thư viện của bạn:

internal static class Logger { 

static Logger() { 

    // configure logger 

} 

internal static void Log(string Message, params object[] args) { 

    var message = string.Format(Message, args); 
    // write message 

} 
+1

LƯU Ý: Tham số thứ hai trong chữ ký cho 'Nhật ký' có lỗi đánh máy. Từ khóa là 'params' thay vì' param' và toàn bộ dòng nên đọc: 'internal static void Log (chuỗi Message, params object [] args) {' –

+0

Thanks @DavidTansey: fixed – IAbstract

+0

@IAbstract Làm cách nào để chia sẻ chung đăng nhập giữa các mã mà các cuộc gọi thư viện lớp và thư viện lớp học chính nó? – Howiecamp

0

Bạn có thể sử dụng singleton cho trình ghi nhật ký của mình và gọi nó là từ bất cứ nơi nào bạn muốn.

+1

Tôi nghĩ rằng singleton là hình thức xấu và không được biện minh trong trường hợp này. – IAbstract

+0

Tôi nghĩ bạn có thể giải thích điều đó. – CodeCaster

+0

Không nên xem xét đơn đầu tiên cho bất kỳ giải pháp nào. Nếu bạn nghĩ * "singleton có thể làm việc ở đây" *, bạn chỉ nên sử dụng một lớp tĩnh. Tuy nhiên, nếu bạn xác định rằng lớp tĩnh yêu cầu một trạng thái, hoặc phải thực hiện một số giao diện, ** sau đó ** xem xét một singleton. Thông thường, các lớp tĩnh sẽ đủ. – IAbstract

1

Tùy chọn của tôi sẽ là các phương pháp mở rộng triển khai một số lớp tĩnh như được đề cập bởi @IAbstract. Nếu lớp học của bạn tất cả các cài đặt giao diện ILOG riêng của bạn, bạn có thể làm điều đó một cái gì đó như thế này:

public static void Log(this ILog source, string message) 
{ 
    source.Log(message, null); 
} 

public static void Log(this ILog source, string message, param object[] args) 
{ 
    // Assuming a static class as mentioned by @IAbstract 
    Logger.Log(message, args); 
} 

Sau đó, trong lớp học của bạn hay từ bất cứ nơi tùy thuộc vào mức độ bảo vệ bạn muốn có thể sử dụng this.Log(message) trong hoặc bên ngoài myClass.Log(message). Điều này sẽ không cần phải được công khai, nhưng điều đó sẽ phụ thuộc vào nhu cầu của thư viện.

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