Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > C# WinApp, запись в форму из стороннего класса


Автор: Rockie 9.11.2015, 21:32
Привет!

я хочу сделать класс-логгер, который можно бы было подключать к разным проектам. К примеру чтобы и в консольном приложении и в WinApp можно бы было написать к примеру 
Код
logger.Message("blah blah");


Вообще у меня был класс логгера который писал к примеру в консоль, ULS, в текстовый файл.. я просто закомментачивал ненужные методы. но cейчас хочу его прикрутить и в WinApp и наконец-то сделать правильно.

У меня есть рабочий вариант, который пишет из класса логгера в текстбокс формы(отбросим то что при записи на форум надо вызывать InvokeRequired, т.к. пример учебный)

Это класс логгера. Он содержит в себе экземпляр формы и конструктор, который инстанцирует эту форму(экземпляр логгера мы создадим на форме)

Код
class MyLogger
    {
        private readonly Form1 form;

        public MyLogger(Form1 form)
        {
            this.form = form;
        }

        public void Message()
        {
            this.form.LogStream = "Blah blah from MyLogger";
        }
    }


А вот собсно форма. Форма содержит свойство "LogStream", которое в Set пишет в контрол-текстбокс. А сторонний класс может к этому свойству достучаться. Ну и собсно всё, по кнопке вызывается Message() стороннего класса-логгера, который пишет на форму:

Код

public partial class Form1 : Form
    {
        private MyLogger logger;

        public string LogStream
        {
            get
            {
                return this.tbLogger.Text;
            }
            set
            {
                this.tbLogger.AppendText(value + Environment.NewLine);
            }
        }

        public Form1()
        {
            InitializeComponent();

            logger = new MyLogger(this);
        }

        private void buttonWrite_Click(object sender, EventArgs e)
        {
            logger.Message();
        }
    }


Как сделать это правильнее - в данном варианте непонятно что делать для консольного приложения - закомментачивать конструктор с формой чтоли?..

и другой вопрос - если у меня ещё один сторонний класс, как на рисунке - как мне реализовывать логгер из него? тоже передавать форму и туда, бред какой-то..

user posted image

Автор: chupachups 10.11.2015, 12:32
Нужно использовать интерфейсы. Для логера:
Код

public interface ILogger
{
    void AddListner(ILogListner listner);
    void RemoveListner(ILogListner listner);
    void WriteMessage(string message);
}

Для форм, консоли, файлов и прочего:
Код

public interface ILogListner
{
    void ProcessMessage(string message);
}

Для каждого "слушателя" логов реализуешь интерфейс ILogListner и кидаешь его в логер - AddListner(ILogListner listner).
Логер должен иметь коллекцию слушателей и когда логеру говорят WriteMessage(string message) - он пробегает по всем слушателям и вызывает у них ProcessMessage(string message)

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/C-WinApp-zapis-v-formu-iz-storonnego-klassa-id5640e6deae201568208b4567#findElement_E7045_5641b9c4ae20153c518b4987_0

Автор: infarch 11.11.2015, 11:48
Вы лучше изучите для начала что-нибудь из готовых популярных логеров. NLog, Log4net...
Если вам чисто для фана, то попробуйте свой логер сделать по аналогии. Если же вам нужно готовое рабочее решение то возьмите один из них и  не парьтесь.

Автор: Rockie 12.11.2015, 08:54
Цитата

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

infarch, ну мне и то и другое - чтобы один раз уже разобраться, и чтобы юзать в своих проектах. Часто возникает ситуация когда сначала логика пишется в консоли, а потом его надо запихнуть к примеру в asp.net вебчасть, или ещё куда.. 
Спасибо!

chupachups, воо... Спасибо!! я если что ещё спрошу тут, может посоветуете правильно ли делаю..




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)