SCSF:将消息附加到LogView中。使用事件发布

时间:2010-03-11 08:07:38

标签: c# scsf

我在Infrastructure.Module项目中创建了一个新的View(LogView)。此视图将用作VS中的LogViewer,如输出窗口。我想在不同模块的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项目中

在Infrastructure.Module的ModuleController.cs中,我在WorkItem.Services集合中添加了LogWriter

 WorkItem.Services.AddNew<LogWriter>();

在另一个项目中我正在使用

var logWriter = WorkItem.Services.Get();         if(logWriter!= null)             logWriter.WriteMsg( “消息”);

但是它返回null。

模块加载顺序也正确。

1 个答案:

答案 0 :(得分:0)

将此属性添加到LogWriter类

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

然后在您的代码中通过执行以下操作来访问它:

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

这将要求LogWriter所在的模块在尝试访问它的模块之前加载。如果它们是分开的,我建议添加一个模块依赖项。确切的方法取决于您使用的IModuleLoader。