2009-12-28 32 views
7

Tengo una clase en la que dentro de esta clase hay un método privado y muchos métodos públicos. Se debe llamar a este método privado cada vez antes de llamar a cualquier otro método.Llamar a un método cada vez antes de llamar a cualquier otro método

El enfoque más simple sería llamar al método en todos los métodos, pero no me gusta este enfoque. ¿Hay alguna otra forma de lograr esto?

+2

¿verdad Me gusta compartir tu código con nosotros? Esto podría ser un problema de diseño ... –

+0

Estoy de acuerdo con @Steve en que esto parece un problema de diseño. En mi experiencia, si algo no se siente bien o se siente como si estuvieras torturando una forma estándar de hacer algo, entonces debes volver a evaluar tu diseño general porque es probable que introduzcas un olor a código. P.ej. siempre tendrá que recordar llamar a este método cada vez que amplíe su API, ¿y si se olvida? No hay advertencias de compilación, y tienes una excepción de bomba de tiempo esperando allí. Dicho esto, también estoy de acuerdo con las respuestas de que AOP puede ser el camino a seguir aquí. –

Respuesta

10

Es posible que pueda hacer algo aquí con AOP, tal vez a través del PostSharp; pero si no va a hacer esto lotes, yo argumentaría a favor de mantenerlo simple, y simplemente agregue el código adicional.

Por supuesto, se vuelve más compleja si necesita polimorfismo y necesita anulaciones todavía llamar al método primera (probablemente la participación de un método público no virtual y un método virtual protegido):

public void Foo() { 
    Bar() 
    FooCore(); 
} 
protected virtual void FooCore() {...} // default Foo implementation 
private void Bar() {...} // your special code 
+1

Ahh ... metaprogramación en tiempo de compilación en C#. Será un día maravilloso cuando eso llegue. – LBushkin

5

Este es un caso típico de aspect oriented programming. Hasta donde yo sé, no hay una manera fácil de hacer esto en .NET (excepto que usar mejora de código byte o creación de una clase derivada en tiempo de ejecución, tampoco es fácil. Hay bibliotecas que lo hacen, por ejemplo spring.net. Estoy no estoy seguro si realmente necesita esto.)

Trataría de evitar esta situación a casi cualquier costo, o llame a este método si realmente no hay otra manera.

Cuestiones relacionadas