SCSF ( СКСФ ):Добавляйте сообщения в LogView.использование публикации события

StackOverflow https://stackoverflow.com/questions/2423411

  •  19-09-2019
  •  | 
  •  

Вопрос

Я создал новое представление (LogView) в инфраструктуре.Проект модуля.Это представление будет использоваться как 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 находится в инфраструктуре.Проект интерфейса LogViewer находится в инфраструктуре.Проект модуля

В ModuleController.cs инфраструктуры.Модуль, который я добавил LogWriter в WorkItem.Коллекция сервисов

 WorkItem.Services.AddNew<LogWriter>();

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

переменная LogWriter = WorkItem.Services.Get();if (LogWriter != null) LogWriter.WriteMsg("сообщение");

но это возвращает мне значение null.

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top