2013-11-23 10 views
9

ho una classe che assomiglia a questo:l'esecuzione di un metodo dopo diversi metodi funzionano

public class SomeClass 
{ 
    public void SomeMethod1() { ... } 
    public void SomeMethod2() { ... } 
    public void SomeMethod3() { ... } 

    private void SomeSpecialMethod(SomeParameter) { ... } 
} 

Per il momento, ho ciascuno dei primi 3 metodi chiamano SomeSpecialMethod() poco prima di questi metodo di ritorno. Aggiungerò circa altri 15 metodi che alla fine necessitano tutti di eseguire SomeSpecialMethod() e mi chiedo se c'è un modo per dire "quando uno qualsiasi dei metodi in questa classe è in esecuzione, eseguire SomeSpecialMethod()" senza dover esplicitamente ripetere la chiamata alla fine di ogni metodo e, naturalmente, impedire a SomeSpecialMethod() di chiamare se stesso all'infinito.

Grazie per i vostri suggerimenti.

risposta

4

Stai cercando AOP - programmazione orientata all'aspetto.

C# non segue questo paradigma, ma è possibile imitarlo. PostSharp è un'opzione, ma preferirei utilizzare gli intercettatori Castle/DynamicProxy: http://docs.castleproject.org/Windsor.Interceptors.ashx

Sarà necessario creare un intercettore che avvolga l'oggetto e intercetti le chiamate ad esso. In fase di esecuzione, Castle renderà questo intercettore estendete la vostra classe concreta o implementando un'interfaccia comune - questo significa che sarete in grado di iniettare l'intercettore in qualsiasi pezzo di codice che sia diretto a SomeClass. Il codice dovrebbe essere simile a questa:

public class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     //add your "post execution" calls on the invocation's target 
    } 
} 

Modifica

Introduzione alla AOP con il Castello: http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

intercettori, e AOP in generale, di solito vengono utilizzati per cose come la registrazione della risultato di ogni chiamata al metodo di un oggetto, o registrazione di ogni eccezione generata da qualsiasi metodo.

Se la logica all'interno di SomeSpecialMethod è astratta e non è realmente correlata a SomeClass (ad esempio la registrazione, ad esempio), potrebbe avere senso spostare la logica sull'intercettore stesso - ma dipende da voi.

+0

Ok, grazie per la risposta; Non sapevo di AOP. Ho intenzione di lasciare il mio schema di codice come è per ora, ma terrò a mente la risposta. – frenchie

1

una volta ho dovuto affrontare un tale problema e risolto in questo modo: una classe dichiarato auxuliary annidato (ad esempio, X) senza campi/metodi, solo con un costruttore che prende un oggetto di SomeClass e chiama il suo SomeSpecialMethod(). Poi fatti tutti SomeClass 's metodi restituiscono che X:

public X SomeMethod1() { 
    ... 
    return new X(this); 
} 

Naturalmente, c'è un sovraccarico, e si può fare questo con non void metodi (beh, è ​​possibile, ma si otterrà brutto).

+1

Qual è il vantaggio di questo chiamando l'evento ogni metodo? Entrambi richiedono una riga (a condizione di aggiungere il gestore nel costruttore). –

+0

@JeroenVannevel Autocostruzione, immagino? Questa classe 'X' potrebbe essere chiamata' GuaranteedToCallSomeSpecialMethodOnReturn'. –

Problemi correlati