2016-05-10 4 views
0

Я работаю над проектом VB.NET, который использует несколько классов и записывает сообщения об ошибках и записывает сообщения в файл с помощью System.IO FileWriter. Я хочу изменить это поведение и собрать сообщения об ошибках и протоколировать сообщения в одном списке (Of String), который я могу отправить в другое приложение. То, что я прошу здесь, похоже на глобальную переменную типа List (Of String), которую я могу использовать в нескольких классах. Вот пример того, что я прошу:Используйте один список (из строки) в нескольких классах для ведения журналов

Dim loggingList As List (Of String) = New List (Of String)

Класс 1: loggingList.Add ("сообщение строка")

Класс 2: loggingList.Add ("сообщение строка")

Класс 3: loggingList.Add ("сообщение строка")

Я понимаю, что я был определен выше переменная экземпляра типа L ist (Of String), но поведение, которое я собираюсь сделать, это использовать тот же List (Of String) во всех трех классах. Не уверен, что я должен делать или как это сделать. Я думаю, что я должен определить статический класс со списком (Of String) в нем, но я не уверен.

Я читал статические классы, но я не нахожу информацию, которая мне нужна для ответа на мой вопрос. Я хочу использовать тот же List (Of String) в отдельных классах, и у меня уже есть код для отправки этого списка в другое приложение, когда я собрал все сообщения. Заранее благодарю за любую помощь.

+1

Создайте модуль (это будет глобальный) и объявите свой список там как 'Dim loggingList как новый список (Of String)'. – Arvo

+0

Есть несколько действительно хороших библиотек для ведения журнала, а не изобретать инструмент, но класс, чтобы сделать все это для вас, имеет смысл. Один экземпляр может регистрировать все для приложения. – Plutonix

ответ

0

Просто используйте класс с Shared Property, который ваш список:

Public Class Logging 
    Public Shared Property LogMessages As New List(of String) 
End Class 

Вы можете добавить запись как этот в любом месте вашего приложения:

Logging.LogMessages.Add("message string") 

Это лучший вариант, чем при использовании модуль, поскольку вы можете расширить функциональность в будущем

+0

Я пошел вперед и внедрил модуль, прежде чем читать этот последний ответ. Благодарим вас за разъяснение различия между использованием класса и модуля. Код, который передает List (Of String), принимает список как параметр. Как передать свой loggingList в качестве параметра, используя его свойство getter? –

+0

Просто позвоните 'MyMethod (Logging.LogMessages)' –

0

В конечном счете, у вас есть много вариантов, и вам просто нужно выбрать подход, который вы считаете лучшими но я расскажу несколько примеров из различных продуктов, которые мы разрабатываем.

Статический журнал

Как уже Wilko @ Matt поделился, вы могли бы взять один из самых простых подходов и иметь статический List<String> для журналов. Если вы выполняете требования регистрации, это очень просто, это лучший подход. Он дает вам то, что вы хотите, общие журналы, доступные во всем приложении, с минимальным требуемым программированием.

public static class Log 
{ 
    private static readonly List<String> entries = new List<String>(); 
    public static ICollection<String> Entries => entries; 
} 

Единственное замечание я добавлю, что я подвергла бы это как ICollection<String>, как List<String> больше предназначена как частное деталей реализации класса, а не тип общественного апи, хотя это может быть List<String> внутри, вызывающему не нужно знать это или заботиться.

Единица работы лесозаготовительной апи

Я написал Logging API как часть нашего слоя данных.У нас есть стандартный просмотрщик журналов, который мы создали как часть нашего веб-приложения, но все наши журналы программного обеспечения находятся в одном месте с использованием согласованного api. В нашем случае это, в конечном счете, используется Entity Framework, но это может быть StreamWriter или FileStream. Вы можете игнорировать это и сосредоточиться только на дизайне api.

using (var context = new DataContext()) 
{ 
    context.Log.NewEntry(LogCategory.Information, "Message"); 
} 

Я также разработаны различные варианты исполнения, потому что у нас есть миллионы строк, так что вы можете делать такие вещи, как отключить context.AutoSave, пока вы не будете готовы писать журналы вне. И, хотя это было частью нашего слоя данных, он был абстрагирован на свой собственный LogContext.

using (var logger = new LogContext()) 
{ 
    logger.NewEntry(LogCategory.Error, "Message"); 
} 

И в конце концов, мы сделали это реализовать в другом слое, как Singleton так журналы будут совместно, так что мы имели один LogContext для приложения.

протоколирование компонентов

Я недавно написал заявление, где я хотел собрать протоколирование в конце процесса и показать, что для пользователя. В моем случае это было приложение на основе мастера, где каждая страница была получена из одного базового класса и отвечала за собственный журнал.

public abstract class UpgradeStep 
{ 
    public ICollection<Log> 
    { 
     get; 
     private set; 
    } 
} 

public class DatabaseUpgradeStep : UpgradeStep 
{ 
    public override void PerformStep() 
    { 
     Log.Add(new UpgradeLog { Message = "Hello" }); 
    } 
} 

В моем случае, журналы не просто в System.String были, но в конце работы мастера я был в состоянии перечислить через мою коллекцию UpgradeSteps и создать коллективный журнал из различных этапов.

Существует множество способов реализовать регистрацию, и, как я уже сказал, выберите один, который прост и наилучшим образом соответствует вашим потребностям, если вам не нужно что-то более сложное. В вашем случае это звучит так, как будто ваши потребности довольно простые, но я оставлю вас с несколькими советами, которые мы живем, после написания слишком большого количества журналов.

  • Попытка отделить протоколирование из вашей логики с помощью событий, обратных вызовов, адаптеры
  • Put протоколирования словоблудие в файл ресурсов, поэтому он может быть изменен без изменения кода
  • кодов
  • Использование статуса вместо длинного словоблудия где

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

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