1

イベントを報告するコンポーネントを使用するリポジトリがあります。

報告されたイベントをフロントエンドに表示したい。

これはリポジトリです:

public interface IXmlRepository
{
    //irrelevant stuff removed
    event EventHandler TraceEventHandler;
}

public class XmlPanelRepository : IXmlRepository
{
    public XmlPanelRepository()
    {
        public event EventHandler TraceEventHandler;

        var panelCom = new PanelCom(); // this is a COM object that connects to a device

        // when something happens in the COM object it reports it.
        panelCom.Trace += panelCom_Trace; 

    // I want to bubble the trace events up to my UI.
        TraceEventHandler += TraceEventHandler_Tracing;
    }

    private void TraceEventHandler_Tracing(object sender, EventArgs e)
    {
        // what do I do here?
    }

    void panelCom_Trace(string message)
    {
        if (TraceEventHandler!= null) TraceEventHandler.Invoke(this, new EventArgs());
    }
}

私の UI は Service を使用して、リポジトリとやり取りします。サービスは次のように定義されます。

public interface IXmlConfigurationService
{
    //irrelevant stuff removed

    event EventHandler TraceEventHandler;
}

public class XmlConfigurationService : IXmlConfigurationService
{
    public event EventHandler TraceEventHandler;

    public XmlConfigurationService(IXmlRepository configurationRepository)
    {
        _configurationRepository.TraceEventHandler += ConfigurationRepository_TraceEventHandler;
    }

    void ConfigurationRepository_TraceEventHandler(object sender, EventArgs e)
    {
        // this never gets hit.
        if (TraceEventHandler != null) TraceEventHandler.Invoke(sender, e);
    }
}

これを機能させることができれば、同じ手順に従ってイベント レポートを表示する UI を取得できると思います。

リポジトリで発生しているイベントをサービスに報告させるにはどうすればよいですか?

4

2 に答える 2

0

私の理解が正しければ、あなたはあなたのイベントを遂行する必要があります。これは、Observer パターンですべてのリッスン オブザーバーを満たす Observable に似ています。ただし、次のように記述されたイベントの場合:

public XmlPanelRepository()
    {
        public event EventHandler TraceEventHandler;

        var panelCom = new PanelCom(); // this is a COM object that connects to a device

        // when something happens in the COM object it reports it.
        panelCom.Trace += panelCom_Trace; 

    // I want to bubble the trace events up to my UI.
        TraceEventHandler += TraceEventHandler_Tracing;
    }

    private void TraceEventHandler_Tracing(object sender, EventArgs e)
    {
        if (TraceEventHandler != null)
        {
              TraceEventHandler(this, e);
        }

    }

ただし、イベントを公開しているという理由以外で、イベントに別の名前を付ける必要がTraceEventHandlerある場合があります (通常、過去形で表現されます)。

また、バブルアップするときにイベント引数を変更できる可能性があることにも注意してください (必要に応じて)。 これにはEventHandler(TEventArgs)が役立ちます。

于 2012-04-26T11:56:14.463 に答える
-1

デリゲートを使用するのを忘れています...次のようなものを試してください:

public interface IXmlRepository
{
   //irrelevant stuff removed
   event EventHandler TraceEventHandler;
}

public class XmlPanelRepository : IXmlRepository
{
    public delegate void EventHandler(string parameter1, string parameter2);

    public event EventHandler TraceEventHandler;

    public XmlPanelRepository()
    {
        var panelCom = new PanelCom(); // this is a COM object that connects to a device

        // when something happens in the COM object it reports it.
        panelCom.Trace += panelCom_Trace; 

    }

    void panelCom_Trace(string message)
    {
        if (EventHandler != null)
          EventHandler("Event was hit, here's the message:", message);
    }
}

public interface IXmlConfigurationService
{
    //irrelevant stuff removed
}

public class XmlConfigurationService : IXmlConfigurationService
{
    public XmlConfigurationService(IXmlRepository configurationRepository)
    {
        _configurationRepository.TraceEventHandler += ConfigurationRepository_EventHandler;
    }

    void ConfigurationRepository_EventHandler(string parameter1, string parameter2);)
    {
        // Do something with your parameters.
        Response.Write(parameter1 + parameter2);
    }
}
于 2012-04-26T12:10:07.577 に答える