SCSF: добавление сообщений в LogView. используя публикацию событий - PullRequest
1 голос
/ 11 марта 2010

Я создал новый вид (LogView) в проекте Infrastructure.Module. Это представление будет использоваться как LogViewer как окно вывода в VS. я хочу написать разные сообщения о статусе в этом LogView из разных модулей.

Я также создал класс LogWriter, который публикует событие для записи сообщения в LogView

У меня возникла проблема с доступом к этому классу LogWriter во всем приложении ... скажите, пожалуйста, как я могу использовать это ...

public class LogWriter 
    {
        [EventPublication(EventTopicNames.WriteToLog, PublicationScope.Global)]
        public event EventHandler<EventArgs<string>> WriteToLog;

        private void OnWriteToLog(EventArgs<string> eventArgs)
        {
            if (WriteToLog != null)
            {
                WriteToLog(null, eventArgs);
            }
        }

        public void WriteMsg(string msg)
        {
            OnWriteToLog(new EventArgs<string>(msg));
        }
    }

и в LogView подписка на события

 [EventSubscription(EventTopicNames.WriteToLog, ThreadOption.UserInterface)]
        public void OnWriteToLog(object sender, EventArgs<string> eventArgs)
        {
            this.txtLogs.AppendText(eventArgs.Data + Environment.NewLine);
        }

пожалуйста, предложите мне решение

Класс LogWriter находится в проекте Infrastructure.Interface LogViewer находится в инфраструктуре. Модульный проект

В ModuleController.cs из Infrastructure.Module я добавил LogWriter в коллекцию WorkItem.Services

 WorkItem.Services.AddNew<LogWriter>();

и в одном другом проекте я получаю его, используя

var logWriter = WorkItem.Services.Get (); if (logWriter! = null) logWriter.WriteMsg ( "сообщение");

но это возвращает меня к нулю.

последовательность загрузки модуля также правильная.

1 Ответ

0 голосов
/ 11 марта 2010

Добавьте этот атрибут в ваш класс LogWriter

[Service(typeof(LogWriter), AddOnDemand=true)]
public class LogWriter
{
    ...
}

тогда в вашем коде просто получите к нему доступ, выполнив это:

var logWriter = WorkItem.Service.Get<LogWriter>();
if (logWriter != null)
    logWriter.WriteMsg("message");

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

...