C# 如何通过服务将事件从存储库冒泡到UI?

C# 如何通过服务将事件从存储库冒泡到UI?,c#,events,repository,repository-pattern,C#,Events,Repository,Repository Pattern,我有一个使用报告事件的组件的存储库 我想在前端显示报告的事件 这是存储库: public interface IXmlRepository { //irrelevant stuff removed event EventHandler TraceEventHandler; } public class XmlPanelRepository : IXmlRepository { public XmlPanelRepository() { publi

我有一个使用报告事件的组件的存储库

我想在前端显示报告的事件

这是存储库:

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使用服务与存储库接口。该服务定义为:

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显示事件报告


如何让服务报告存储库中发生的事件?

如果我理解正确,您需要完成事件。这类似于观察者模式中的可观察者满足所有倾听的观察者。但对于这样写的事件:

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);
        }

    }
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);
    }
}
但是,也许您应该将事件命名为TraceEventHandler以外的名称,因为您现在正在公开一个通常用过去时表示的事件


还值得注意的是,如果愿意,可以在冒泡时更改事件args。可以帮助解决此问题。

您忘记使用代理。。。 试着这样做:

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);
        }

    }
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);
    }
}

不要冒泡事件,而是从UI向下发送跟踪侦听器类型的对象或您自己制作的对象。在panelCom_跟踪处理程序中,写入侦听器。这对我来说似乎更直观。我同意@Marc。您不应该尝试像这样将层耦合在一起。然而,如果这是您真正想要的,那么我建议您研究pub/sub模式,或者观察者模式,因为dtryon建议Seventhandler是.NET中内置的事件代理。我引用伟大的荷马·辛普森的话:傻瓜!