SCSF: добавление сообщений в LogView. с помощью публикации событий

Я создал новый вид (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 находится в проекте Infrastructure.Module.

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

 WorkItem.Services.AddNew<LogWriter>();

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

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

но он возвращает мне ноль.

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


person Mohsan    schedule 11.03.2010    source источник


Ответы (1)


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

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

то в вашем коде просто получите к нему доступ, выполнив следующие действия:

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

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

person Tom Anderson    schedule 11.03.2010
comment
с подписками на события убедитесь, что ваше представление либо встроено, либо добавлено к одной из коллекций объектов рабочего элемента (SmartParts или Items). - person Tom Anderson; 11.03.2010
comment
строка var logWriter = WorkItem.Service.Get ‹LogWriter› (); всегда возвращает ноль - person Mohsan; 11.03.2010
comment
находится ли класс LogWriter в той же сборке, что и класс ModuleInit? - person Tom Anderson; 11.03.2010
comment
У меня 17 модулей. Класс LogWriter находится в Infrastructure.Interface, а LogView - в проекте Infrastructure.Module. который всегда загружается при запуске приложения. и я обращаюсь к LogWriter из других модулей .. но он возвращает ноль. - person Mohsan; 11.03.2010
comment
Возможно, вам придется добавить службу вручную. WorkItem.Services.AddNew ‹LogWriter› (); Одно предостережение заключается в том, что вам нужно будет добавить зависимость модуля, чтобы быть уверенным, что служба добавлена, прежде чем вы ее используете. - person Tom Anderson; 11.03.2010
comment
я могу создать статический объект LogWriter в каждом модуле с помощью WorkItem.Items.AddNew ‹LogWriter› () и получить доступ к этому статическому объекту в желаемых классах этого модуля. Не думаю, что это будет хороший подход. - person Mohsan; 11.03.2010