[英]Using Generics in Base Classes in C#: How to ensure methods in the base class return the derived class's type?
[英]C# derived class type needed in base for logging using NLog
我們正在使用NLog登錄C#MVC3 Web應用程序。 我們所有的控制器都擴展了自定義基礎“ ApplicationController”,使我們可以訪問不斷需要的方法和s成員。
我希望所有控制器都可以通過此基類訪問Logger,但是希望了解知道日志語句源自哪個派生類的詳細信息。
我們的應用程序控制器如下所示:
public abstract class ApplicationController : Controller
{
protected Logger _logger;
protected virtual Logger Logger
{
get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
}
protected ApplicationController()
{
Context = new Entities();
}
如果派生的控制器沒有覆蓋Logger,則所有語句將顯示它們源自Application控制器。 當前,在所有派生的控制器中,我基本上具有相同的Logger語句。 例如:
public class PropertyController : ApplicationController
{
private readonly DatatapeService _datatapeService;
private readonly PropertyService _propertyService;
protected override Logger Logger
{
get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
}
顯然,這是不良的實施實踐。
TIA!
我不熟悉NLog,但是在Log4Net中,語法LogManager.GetLogger(this.GetType())
將完成您想要的。 即使在基礎ApplicationController
類中調用了GetType
也會在繼承層次結構中返回葉類型,當首次創建記錄器時(即:首次訪問Logger屬性時)它將使用PropertyController
類型實例化它
NLog API與Log4net略有不同。 您需要使用
Logger = LogManager.GetLogger(GetType().Name);
如果僅傳遞類型,LogManager將期望記錄器類型(即自定義記錄器)
NLog Wiki的 “ 如何為子類創建記錄器”頁面現在建議以下模式:
class BaseClass
{
protected BaseClass()
{
Log = LogManager.GetLogger(GetType().ToString());
}
protected Logger Log { get; private set; }
}
class ExactClass : BaseClass
{
public ExactClass() : base() { }
...
}
只需在此處檢查nLog Wiki
在大多數情況下,每個班級只有一個記錄器,因此為記錄器提供與當前班級相同的名稱是很有意義的。
這樣做很有意義
public abstract class ApplicationController : Controller
{
protected Logger _logger;
protected virtual Logger Logger(string className)
{
return LogManager.GetLogger(className);
}
}
public class PropertyController : ApplicationController
{
private readonly DatatapeService _datatapeService;
private readonly PropertyService _propertyService;
protected override Logger Logger()
{
return base.Logger("PropertyController ");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.