如何在异常处理中使用接口

时间:2010-06-09 09:21:40

标签: c# generics interface code-reuse

我正在为我的应用程序处理异常处理层。

我读过很多关于接口和泛型的文章。我之前已经使用了很多继承,我对那个领域很满意。

我有一个非常简短的设计,我将要实施:

public interface IMyExceptionLogger
{
   public void LogException();

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

我有点困惑我接下来应该做什么。

public class FooClass: IMyExceptionLogger
{

   // Fields
   // Constructors

}

我应该在LogException()中实施FooClass方法吗?如果是的话,我正在努力看到我如何更好地使用界面而不是具体的类......

我有各种各样的类可以使用该接口,但我不想在每个类中编写该接口的实现。

同时如果我在一个类中实现一个接口,然后在应用程序的不同层中使用该类,我将仍然使用具体的类而不是接口,这是一个糟糕的OO设计......

我希望这是有道理的。

欢迎任何反馈和建议。

请注意我对使用net4log或其竞争对手不感兴趣,因为我这样做是为了学习。

谢谢

修改

写了一些代码。因此,我将使用此接口实现各种记录器,即DBExceptionLoggerCSVExceptionLoggerXMLExceptionLogger等。我将最终得到具体的类,我将不得不在不同的层使用我的申请。

4 个答案:

答案 0 :(得分:2)

你无法避免让具体的类实现IMyExceptionLogger。但是,您可以停止需要执行异常日志记录的类,使其依赖于这些具体类。这就是界面的用途。因此,您将记录器作为所有需要使用它的类的依赖项注入:

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

您还可以查看一些IoC容器,例如Unity,以帮助您更轻松地管理这些依赖项。

答案 1 :(得分:1)

定义一个接口Logger并根据需要定义任意数量的具体实现(实现它)。

接下来使用组合 - 每个需要记录某事的类都应该注入一个Logger(通过ctor参数或setter)。

这对我来说听起来更自然。

答案 2 :(得分:1)

是的,你必须在FooClass中实现LogException()方法。

在您的情况下接口的优点是您可以创建记录器的具体类型(FooClass或DBExceptionLogger左右)并仅传递IMyExceptionLogger引用。因此,所有记录信息的类都将独立于记录器的具体实现。

答案 3 :(得分:1)

你应该使用一个接口说IExceptionLog。如果混凝土条款有很多共同点,例如XmlLogger,SOAPLogger可以为那些创建基类。在要使用记录器的类中,应创建具有类型IExceptionLog(接口)的成员。使用依赖注入设置此成员的值。如果您需要IoC containter

,可以使用