我正在为我的应用程序处理异常处理层。
我读过很多关于接口和泛型的文章。我之前已经使用了很多继承,我对那个领域很满意。
我有一个非常简短的设计,我将要实施:
public interface IMyExceptionLogger
{
public void LogException();
// Helper methods for writing into files,db, xml
}
我有点困惑我接下来应该做什么。
public class FooClass: IMyExceptionLogger
{
// Fields
// Constructors
}
我应该在LogException()
中实施FooClass
方法吗?如果是的话,我正在努力看到我如何更好地使用界面而不是具体的类......
我有各种各样的类可以使用该接口,但我不想在每个类中编写该接口的实现。
同时如果我在一个类中实现一个接口,然后在应用程序的不同层中使用该类,我将仍然使用具体的类而不是接口,这是一个糟糕的OO设计......
我希望这是有道理的。
欢迎任何反馈和建议。
请注意我对使用net4log或其竞争对手不感兴趣,因为我这样做是为了学习。
谢谢
修改
写了一些代码。因此,我将使用此接口实现各种记录器,即DBExceptionLogger
,CSVExceptionLogger
,XMLExceptionLogger
等。我将最终得到具体的类,我将不得不在不同的层使用我的申请。
答案 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
,可以使用