2010-06-09 14 views
5

Estoy trabajando en la capa de manejo de excepciones para mi aplicación.Cómo usar interfaces en el manejo de excepciones

He leído algunos artículos sobre interfaces y genéricos. He usado la herencia antes de mucho y me siento cómodo en esa área.

Tengo un muy breve diseño que voy a poner en práctica:

public interface IMyExceptionLogger 
{ 
    public void LogException(); 

    // Helper methods for writing into files,db, xml 
} 

Estoy un poco confundido lo que debería hacer a continuación.

public class FooClass: IMyExceptionLogger 
{ 

    // Fields 
    // Constructors 

} 

¿Debo aplicar LogException() método dentro FooClass? Si es así, entonces estoy luchando por ver cómo soy mejor que usar una interfaz en lugar de la clase concreta ...

Tengo una variedad de clases que harán uso de esa interfaz, pero no lo hago Quiero escribir una implementación de esa interfaz dentro de cada clase.

En el mismo tiempo, si puedo implementar una interfaz en una clase y, a continuación, utilizar esa clase en diferentes capas de la aplicación estaré aún Uso clases concretas en lugar de las interfaces, que es un mal diseño orientado a objetos ...

Espero que esto tenga sentido.

Cualquier comentario y sugerencia son bienvenidos.

Tenga en cuenta que no estoy interesado en utilizar net4log o sus competidores porque estoy haciendo esto para aprender.

Gracias

Editar:

escribió algunas más código. Así que implementaré una variedad de registradores con esta interfaz, es decir, DBExceptionLogger, CSVExceptionLogger, XMLExceptionLogger etc. De todas maneras terminaré con clases concretas que tendré que usar en diferentes capas de mi aplicación.

Respuesta

2

No puede evitar tener clases concretas que implementen IMyExceptionLogger. Sin embargo, puede evitar que las clases que necesitan hacer el registro de excepciones tengan dependencias en esas clases concretas. Para eso es la interfaz. Así se inyecta el registrador como una dependencia de todas las clases que necesitan para utilizarlo:

class MyClass 
{ 
    public MyClass(IMyExceptionLogger exceptionLogger) 
    { 
     .... 
     exceptionLogger.LogException(e); 
    } 
} 

También se puede ver en algunos contenedores COI, como Unity para ayudarle a manejar estas dependencias con mayor facilidad.

+0

Hola, gracias por la respuesta. Esto significa que almacenaré una interfaz en una DLL e implementaciones de esa interfaz en un DLLS independiente. De esta manera tendré varias capas haciendo referencia a la capa de interfaz única. ¿Es esto correcto? –

+0

sí, esa sería una buena manera de hacerlo. –

+0

¡Muchas gracias! Realmente lo aprecio. –

1

Defina un Logger de interfaz y defina tantas implementaciones concretas como desee (implementándolas).

Composición del siguiente uso: cada clase que necesita registrar algo debe tener un Logger inyectado en él (mediante el argumento ctor o un setter).

Esto suena más natural para mí.

1

sí, tiene que implementar el método LogException() en el FooClass.

Ventaja de las interfaces en su caso que puede crear el tipo concreto del registrador (FooClass, o DBExceptionLogger más o menos) y pasar solo la referencia IMyExceptionLogger. De modo que todas sus clases, cuya información de registro sea independiente de la realización concreta del registrador.

+0

Eso tiene perfecto sentido. Spasibo! (thx) –

1

Debería utilizar una interfaz como IExceptionLog. Si las clases concretas tienen mucho en común, p. XmlLogger, SOAPLogger puede crear una clase base para ellos. En las clases en las que desea utilizar el registrador, se debe crear un miembro que tenga el tipo IExceptionLog (la interfaz). El valor de este miembro se establece mediante la inyección de dependencia. Puede usar si quiere un IoC containter

+0

Todo depende de la inyección de la dependencia tiene mucho sentido. Voy a leer el artículo que me ha proporcionado para tener una mejor idea de lo que quiere decir. ¡Gracias! –

+0

He revisado la lista de bibliotecas de inyección de dependencia, pero creo que necesito investigar más para tener una idea de qué es y cómo lo uso. –

+0

De nada :) – Manu