2013-04-29 32 views
5

Tôi sử dụng log4net để thực hiện đăng nhập trong ứng dụng .NET của mình. Tuy nhiên tôi không muốn phân phối 300kb log4net.dll cho mỗi người dùng nhưng thay vì gửi dll này cho người dùng nếu anh ta có vấn đề và tôi muốn anh ta cung cấp nhật ký.Làm cách nào để tạo tùy chọn log4net.dll?

Vì vậy, có thể làm cho ứng dụng của tôi chạy có hoặc không có dll? Tất nhiên để đăng nhập dll sẽ là cần thiết, nhưng nếu không cần đăng nhập, ứng dụng sẽ chạy mà không có dll.

+0

Làm cho nó một plugin. Xem [MEF] (http://mef.codeplex.com/). – Oded

+2

300kb? Không có gì, gửi nó đi. –

+0

@SteveWellens Không có gì? Các exe chỉ có 15kb và không cần phải được cài đặt. –

Trả lời

4

Có, điều đó là có thể.

Đầu tiên tạo một interfase với tất cả các phương pháp đăng nhập của bạn:

public interface ILogger 
{ 
    void Write(string message); 
    // And much more methods. 
} 

Bây giờ tạo ra hai trường hợp, một trường hợp giả (cho phép gọi nó là DummyLogger), và một trường hợp mà sẽ gửi tin nhắn của nó để Log4Net (Log4NetLogger).

Để kết thúc, tạo ra một lớp nhà máy:

static public class LogFactory 
{ 
    static public ILogger CreateLogger() 
    { 
      if (/*Check if Log4Net is available*/) 
       return new Log4NetLogger(); 
      else 
       return new DummyLogger(); 
    } 
} 

Bạn có thể kiểm tra xem Log4Net có sẵn bằng cách đơn giản kiểm tra nếu tập tin là trong bin-thư mục của bạn. Một cái gì đó như:

File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.dll") 

Nhưng tôi có thể tưởng tượng bạn muốn thực hiện các kiểm tra khác, như thể nó tồn tại trong GAC hay bất kỳ thứ gì.

Bây giờ bạn có thể sử dụng máy của bạn để tạo logger của bạn và "ghi" thông điệp đến các bản ghi:

ILogger logger = LoggerFactory.CreateLogger(); 
logger.Write("I am logging something!"); 
+0

Để làm việc này, bạn sẽ cần để tải thư viện log4net động và xây dựng đối tượng 'Log4NetLogger' thông qua sự phản chiếu. Nếu không, ứng dụng chính sẽ chứa một tham chiếu tĩnh đến log4net.dll và từ chối bắt đầu nếu nó không có mặt. – MartinStettner

+0

@MartinStettner: Tôi vừa thử nghiệm nó. Giải pháp của tôi không hoạt động. Một tham chiếu tĩnh sẽ thất bại ngay sau khi bạn gọi một phương thức sẽ chứa (không cần phải gọi/sử dụng) các đối tượng từ assembly bị thiếu. Trong trường hợp của tôi tham chiếu tĩnh sẽ thất bại nếu một trong các thành viên của Log4NetLogger được gọi, điều này sẽ không xảy ra. –

+0

Bạn định cấu hình đăng nhập của mình như thế nào? – sgmoore

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