È una cattiva pratica iscriversi a un evento con un'azione

2

Uso una libreria di terze parti per il riconoscimento vocale.

Questa libreria mi consente di accedere ad alcune classi (SpeechRecognitionEngine, SpeechRecognitionConfiguration etc) che mi danno accesso ad alcuni eventi (OnSpeechRecognized, OnSpeechRecognitionStarted etc).

Così come potrei voler riutilizzare questa libreria ogni giorno, ho creato un progetto dedicato a gestirlo e darmi accesso solo a ciò che voglio.

La mia classe principale del progetto personalizzato ha un'istanza di questo motore di terze parti:

private ThirdPartyASREngineControl _engine;

Che mi consente di accedere all'evento Riconoscimento in questo modo all'interno del mio progetto personalizzato:

  _engine.RecognitionStarting += /*SOME BEHAVIOUR*/

La firma di RecognitionStarting e _ThirdPartyEngineControlEvents_RecognitionStartingEventHandler sono:

event _ThirdPartyEngineControlEvents_RecognitionStartingEventHandler RecognitionStarting;

public delegate void _ThirdPartyEngineControlEvents_RecognitionStartingEventHandler(); 

Ora la mia preoccupazione è che voglio essere in grado di sostituire questo comportamento con qualsiasi cosa desideri in qualsiasi progetto usando MySpeechRecognitionWrapperProject.

Ecco quello che ho visto finora:

using ThirdPartyASR;
using System;
namespace MySpeechRecognitionWrapperProject
{
    public class MyWonderfulMainClass
    {

        private _ThirdPartyEngineControlEvents_RecognitionStartingEventHandler _recognitionStartedAction;
        public Action RecognitionStartedAction
        {
            set
            {
                if (_recognitionStartedAction != null)
                {
                    _engine.RecognitionStarting -= _recognitionStartedAction; // i don't believe this will work
                }
                _recognitionStartedAction =()=> value();
                _engine.RecognitionStarting += _recognitionStartedAction;
            }
        }

        private ThirdPartyASREngineControl _engine;

        public MyWonderfulMainClass()
        {
            _engine = new ThirdPartyASREngineControl();
            /*
             * more code
             *
             */
        }
        /*
         * even more code
         *
         */
    }
}

Come puoi vedere il mio obiettivo qui è che posso impostare qualsiasi comportamento vuoto che voglio da qualsiasi progetto usando MySpeechRecognitionWrapperProject.

Come qualcuno con grandi difficoltà che avvolge la mia testa attorno al sistema di eventi in C #, sono quasi certo che quello che sto facendo è lontano dalla soluzione più accurata che si possa fare in questa situazione.

C'è un modo migliore?

    
posta yan yankelevich 23.11.2016 - 15:20
fonte

1 risposta

-1

Sì. Un EventHandler ha parametri del chiamante e degli eventi che un'Azione non ha.

Perché non esporre un EventHandler<T> o almeno un Action<T>

Usando le azioni si sta reimplementando il sistema EventHandler

    
risposta data 23.11.2016 - 16:57
fonte

Leggi altre domande sui tag