Как использовать интерфейсы в обработке исключений

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

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

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

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 и т.д., Чем я все еще закончу с реальными классами, которые я должен буду использовать в различных слоях моего приложения.

5
задан 9 June 2010 в 09:29
поделиться

4 ответа

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

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

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

2
ответ дан 14 December 2019 в 19:01
поделиться

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

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

Мне это кажется более естественным.

1
ответ дан 14 December 2019 в 19:01
поделиться

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

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

1
ответ дан 14 December 2019 в 19:01
поделиться

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

1
ответ дан 14 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: