Является ли обработка ошибок WPF хорошей идеей? - PullRequest
1 голос
/ 30 декабря 2010

У меня есть многопоточное приложение wpf с различными интерфейсами HW.

Я хочу реагировать на несколько сбоев HW, которые могут произойти.

Например:

один изИнтерфейсы это датчик температуры, и я хочу, чтобы от определенной температуры.появится сообщение и уведомит пользователя о том, что это произошло.

я придумал следующий дизайн:

/// <summary>
/// This logic reacts to errors that occur during the system run.
/// The reaction is set by the component that raised the error.
/// </summary>

public class ErrorHandlingLogic : Logic
{

}

вышеприведенный класс будет использовать ErrorEventData, которая содержит всю информацию об ошибке, котораяпроизошло.

public class ErrorEventData : IEventData
    {
        #region public enum

        public enum ErrorReaction
        {
        }

        #endregion public enum

        #region Private Data Memebers and props

        private ErrorReaction m_ErrorReaction;

        public ErrorReaction ErrorReactionValue
        {
            get { return m_ErrorReaction; }
            set { m_ErrorReaction = value; }
        }

        private string m_Msg;

        public string Msg
        {
            get { return m_Msg; }
            set { m_Msg = value; }
        }

        private string m_ComponentName;

        public string ComponentName
        {
            get { return m_ComponentName; }
            set { m_ComponentName = value; }
        }

        #endregion Private Data Memebers and props

        public ErrorEventData(ErrorReaction reaction, string msg, string componenetName)
        {
            m_ErrorReaction = reaction;
            m_Msg = msg;
            m_ComponentName = componenetName;
        }
    }

вышеупомянутый ErrorHandlingLogic решит, что делать с ErrorEventData, отправленной ему из различных компонентов приложения.

при необходимости он будет перенаправлен в графический интерфейс для отображениясообщение пользователю.

так что вы думаете, это хороший дизайн?

спасибо, Адиэль.

Ответы [ 3 ]

3 голосов
/ 30 декабря 2010

Это кажется достаточно справедливым, однако, с точки зрения дизайна, я бы, вероятно, просто выбрал стандартное событие с пользовательскими аргументами события.

Вот пример:

public interface IEventData
{
    ErrorReaction Reaction { get; }
    string Message { get; }
    ComponentName { get; }
}

public class HardwareChangeEventData : IEventData
{
    public HardwareChangeEventData(ErrorReaction reaction, string msg, string componentName)         
    {             
        Reaction = reaction;             
        Message = msg;             
        ComponentName = componentName;         
    }

    public ErrorReaction Reaction { get; private set; }
    public string Message { get; private set; }
    public ComponentName { get; private set; }
}

....

// introduce a base class so all hardware components can raise the event
public class HardwareComponent    
{
    public delegate void HardwareChangedEventHandler(IEventData ed);
    public event HardwareChangedEventHandler HardwareChanged;

    //event-invoking method that derived classes can override.
    protected virtual void OnHardwareChanged(IEventData ed)
    {
        HardwareChangedEventHandler handler = HardwareChanged;
        if (handler != null)
        {
            handler(this, ed);
        }
    }
}

public class TemperatureGauge : HardwareComponent
{
    public void Monitor()
    {
         // example logic
         while (...)
         {
             if (Temperature < LowThreshold)
             {
                  IEventData ed = new HardwareChangeEventData(ErrorReaction.IncreaseTemp, "Temperature too low!", "TemperatureGauge");
                  OnHardwareChanged(ed);
             } 
         }
    }

    public override OnHardwareChanged(IEventData ed)
    {
        // do something with ed internally (if applicable)
        // forward event on to base so it can be passed out to subscribers
        base.OnHardwareChanged(ed);
    }
}
1 голос
/ 30 декабря 2010

Выше код выглядит хорошо.

Но для уведомления о различных компонентах я бы сказал, искать шаблон Observer (Event / Deleagte)

0 голосов
/ 30 декабря 2010

если вы собираетесь обрабатывать ошибки в WPF, почему бы не использовать для этого валидаторы? см. Эту статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...