【问题标题】:How to use interfaces in exception handling如何在异常处理中使用接口
【发布时间】:2011-03-01 13:50:24
【问题描述】:

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

我读过几篇关于接口和泛型的文章。我以前使用过很多继承,并且对此领域我很满意。

我要实现一个非常简短的设计:

public interface IMyExceptionLogger
{
   public void LogException();

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

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

public class FooClass: IMyExceptionLogger
{

   // Fields
   // Constructors

}

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

我有多种类将使用该接口,但我不想在每个类中编写该接口的实现。

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

我希望这是有道理的。

欢迎任何反馈和建议。

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

谢谢

编辑:

又写了一些代码。因此,我将使用此接口实现各种记录器,即DBExceptionLoggerCSVExceptionLoggerXMLExceptionLogger 等。最终我仍然会得到必须在应用程序的不同层中使用的具体类。

【问题讨论】:

    标签: c# generics interface code-reuse


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 您好,谢谢您的回复。这意味着我将在一个 DLL 中存储一个接口,并将该接口的实现存储在单独的 DLLS 中。这样,我将拥有引用单个接口层的各种层。这是正确的吗?
      • 非常感谢!真的很感激。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        你应该使用一个接口,比如 IExceptionLog。如果具体的类有很多共同点,例如XmlLogger、SOAPLogger 你可以为它们创建一个基类。在要使用记录器的类中,应创建类型为 IExceptionLog(接口)的成员。该成员的值是使用依赖注入设置的。如果你想要IoC containter,你可以使用

        【讨论】:

        • 依赖注入的一切都非常有意义。我将阅读您提供的文章,以更好地了解您的意思。谢谢!
        • 我查看了依赖注入库的列表,但我认为我需要进行更多研究以了解它是什么以及如何使用它。
        • 如果你想要weblogs.asp.net/sfeldman/archive/2008/02/14/…,你可以检查这个
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2012-08-29
        • 1970-01-01
        相关资源
        最近更新 更多