簡體   English   中英

是否可以添加和事件方法的新版本並使用相同的事件ID?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM