2015-03-15 3 views
0

Что касается версий, то documentation for the Semantic Logging Application Block рекомендует:Могу ли я добавить новую версию и метод событий и использовать тот же идентификатор события?

Если вам необходимо изменить свой класс EventSource, вы должны ограничить изменения добавления методов для поддержки новых сообщений журнала, и добавления перегруженных существующих методов (что бы иметь новый идентификатор события). Вы не должны удалять или изменять подпись существующих методов.

Предположим, я имел следующий 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); 
    } 
} 

А потом я хотел бы добавить поддержку для входа в строку запроса. Могу ли я добавить перегруженный метод с тем же идентификатором?

[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); 
} 

Я не совсем уверен, где Event ID вписывается во все это, и сколько поддержание EventSource класса должно оказывать помощь по этому поводу.

ответ

1

EventSource представляет вашу регистрацию как структурированные данные. В этом смысле это официально опубликованный API.

И затем я хотел добавить поддержку для ведения журнала строки запроса. Могу ли я добавить перегруженный метод с тем же идентификатором?

No. EventIds должны быть уникальными. Однако, если вам просто нужно добавить новые параметры к методу, то до тех пор, пока вы добавите их в конец допустимой подписи (и ударите версию события).

Могу ли я сохранить подписи проще, добавив дополнения в класс модели?

Нет, потому что параметры события должны быть примитивными типами (в основном). Пользовательский тип, такой как 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); 
} 

Или вы можете провизировать de Перегрузка, не связанная со случаем для существующих клиентов:

[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); 
} 
+0

Спасибо. В вашем последнем примере я добавляю новый метод или заменяю его (и обновляю все мои абоненты)? – maxwellb

+0

Просто измените существующий метод ... Я добавил несколько подробностей о том, как избежать обновления существующих абонентов. –

 Смежные вопросы

  • Нет связанных вопросов^_^