Как использовать интерфейсы в обработке исключений - PullRequest
5 голосов
/ 09 июня 2010

Я работаю над уровнем обработки исключений для моего приложения.

Я прочитал несколько статей об интерфейсах и обобщениях.Я довольно часто использовал наследование, и мне комфортно в этой области.

У меня есть очень краткий дизайн, который я собираюсь реализовать:

public interface IMyExceptionLogger
{
   public void LogException();

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

Янемного запутался, что мне делать дальше.

public class FooClass: IMyExceptionLogger
{

   // Fields
   // Constructors

}

Должен ли я реализовать метод LogException() в FooClass?Если да, то я не могу понять, как мне лучше использовать интерфейс вместо конкретного класса ...

У меня есть множество классов, которые будут использовать этот интерфейс, но яне хочу писать реализацию этого интерфейса в каждом классе.

В то же время, если я реализую интерфейс в одном классе, а затем использую этот класс в разных слоях приложения, я все равно буду использовать конкретные классы вместо интерфейсов, что является плохим дизайном ОО ...

Надеюсь, это имеет смысл.

Любые отзывы и предложения приветствуются.

Обратите внимание, что я не заинтересован в использовании net4log или его конкурентов, потому что я делаюэтому учиться.

Спасибо

Редактировать:

Написал еще немного кода.Таким образом, я буду реализовывать различные регистраторы с этим интерфейсом, например DBExceptionLogger, CSVExceptionLogger, XMLExceptionLogger и т. Д. Чем я все же буду в итоге с конкретными классами, которые мне придется использовать на разных уровнях моего приложения.

Ответы [ 4 ]

2 голосов
/ 09 июня 2010

Вы не можете избежать использования конкретных классов, реализующих IMyExceptionLogger. Однако вы можете помешать классам, которые должны вести регистрацию исключений, иметь зависимости от этих конкретных классов. Для этого и нужен интерфейс. Таким образом, вы вводите логгер как зависимость от всех классов, которые должны его использовать:

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

Вы также можете просмотреть некоторые контейнеры IoC, такие как Unity , чтобы упростить управление этими зависимостями.

1 голос
/ 09 июня 2010

Вы должны использовать интерфейс, скажем, IExceptionLog. Если у конкретных предложений много общего, например, XmlLogger, SOAPLogger вы можете создать базовый класс для них. В классах, где вы хотите использовать регистратор, должен быть создан член, имеющий тип IExceptionLog (интерфейс). Значение этого члена устанавливается с помощью внедрения зависимости. Вы можете использовать, если хотите, контейнер IoC

1 голос
/ 09 июня 2010

да, вы должны реализовать метод LogException () в FooClass.

Преимущество интерфейсов в вашем случае в том, что вы можете создать конкретный тип регистратора (FooClass или DBExceptionLogger или около того) и передавать только IMyExceptionLoggerссылка.Так что все ваши классы, информация о журнале которых будет зависеть от конкретной реализации логгера.

1 голос
/ 09 июня 2010

Определите интерфейс Logger и определите столько конкретных реализаций, сколько вы хотите (реализуя его).

Следующее использование композиции - в каждый класс, которому нужно что-то записывать, должен быть введен Logger (через аргумент ctor или установщик).

Это звучит более естественно для меня.

...