[英]Can I add a new version of and event method and use same event ID?
如果確實需要修改EventSource類,則應將更改限制為添加方法以支持新的日志消息,以及添加現有方法的重載(該方法將具有新的事件ID)。 您不應刪除或更改現有方法的簽名。
假設我有以下EventSource類:
[EventSource(Name = "Instrumentation")]
public class InstrumentationEventSource : EventSource {
private static readonly Lazy<InstrumentationEventSource> Singleton = new Lazy<InstrumentationEventSource>(() => new InstrumentationEventSource());
public static InstrumentationEventSource Log { get { return Singleton.Value; } }
private InstrumentationEventSource() {}
[Event(eventId: 901)]
public void EndPage(string url) {
WriteEvent(901, url);
}
}
然后,我想增加對記錄查詢字符串的支持。 是否可以添加具有相同ID的重載方法?
[Event(eventId: 901)]
public void EndPage(string url) {
WriteEvent(901, url);
}
[Event(eventId: 901)]
public void EndPage(string url, string queryString) {
WriteEvent(901, url, queryString);
}
在不影響應用程序或進程外主機日志記錄應用程序的情況下,如何支持將來的修改?
通過在模型類中添加添加內容,可以簡化簽名嗎?
public class LogData {
public string url { get; set; }
// public string queryString { get; set; }
}
和
[Event(eventId: 901)]
public void EndPage(LogData data) {
WriteEvent(901, data);
// Or does the params object[] args parameter not support classes?
// WriteEvent(901, data.url);
// And this would have to be changed anyway?
// WriteEvent(901, data.url, data.queryString);
}
我不太確定事件ID是否適合所有事件,以及EventSource
類的維護需要為此多加注意。
EventSource將您的日志記錄顯示為結構化數據。 從這個意義上講,它是一個正式發布的API。
然后,我想增加對記錄查詢字符串的支持。 是否可以添加具有相同ID的重載方法?
否。EventId必須是唯一的。 但是,如果只需要向方法中添加新參數,則只要將它們添加到允許的簽名末尾即可(並增加事件版本)。
通過在模型類中添加添加內容,可以簡化簽名嗎?
否,因為事件參數必須是基本類型(基本上)。 不支持自定義類型,例如LogData。
假設您有:
[Event(eventId: 901)]
public void EndPage(string url) {
WriteEvent(901, url);
}
並且您想要向該方法添加更多信息,則可以修改現有方法:
[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString)
{
WriteEvent(901, url, queryString);
}
如果您不希望這樣影響現有的調用者,則可以為該參數提供默認值:
[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString = null)
{
WriteEvent(901, url, queryString);
}
或者,您可以為現有客戶端提供非事件重載以供使用:
[NonEvent]
public void EndPage(string url) {
this.EndPage(url, null);
}
[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString)
{
WriteEvent(901, url, queryString);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.