1

Infrastructure.Module プロジェクトに新しい View (LogView) を作成しました。このビューは、VS の出力ウィンドウのような LogViewer として使用されます。さまざまなモジュールから、この LogView にさまざまなステータス メッセージを書き込みたいと考えています。

また、メッセージを LogView に書き込むイベントを発行するクラス LogWriter を作成しました

アプリケーション全体でこの 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>();

そして、他の1つのプロジェクトで私はそれを使用しています

var logWriter = WorkItem.Services.Get(); if (logWriter != null) logWriter.WriteMsg("メッセージ");

しかし、それは私にnullを返しています。

モジュールのロード シーケンスも正しいです。

4

1 に答える 1

0

この属性を LogWriter クラスに追加します

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

次に、コードで次のようにしてアクセスします。

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

これには、アクセスしようとするモジュールの前に、LogWriter が含まれるモジュールがロードされる必要があります。それらが分離されている場合は、モジュールの依存関係を追加することをお勧めします。それを行う正確な方法は、使用している IModuleLoader によって異なります。

于 2010-03-11T08:14:39.970 に答える