2010-06-09 3 views
5

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

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

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

public interface IMyExceptionLogger 
{ 
    public void LogException(); 

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

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

public class FooClass: IMyExceptionLogger 
{ 

    // Fields 
    // Constructors 

} 

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

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

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

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

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

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

Спасибо

Edit:

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

ответ

2

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

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

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

+0

Эй, благодарю вас за ответ. Это означает, что я буду хранить интерфейс в одной DLL и реализации этого интерфейса в отдельных DLLS. Таким образом, у меня будут разные слои, ссылающиеся на один уровень интерфейса. Это верно? – 2010-06-09 09:46:54

+0

Да, это был бы хороший способ сделать это. –

+0

Спасибо большое! Действительно ценю это. – 2010-06-09 10:13:34

1

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

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

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

1

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

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

+0

Это имеет смысл. Spasibo! (thx) – 2010-06-09 09:47:31

1

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

+0

Все, что требуется для инъекций зависимостей, имеет смысл. Я собираюсь прочитать статью, которую вы предоставили, чтобы лучше понять, что вы имеете в виду. Спасибо! – 2010-06-09 10:00:01

+0

Я просмотрел список библиотек инъекций зависимостей, но я думаю, что мне нужно больше исследовать, чтобы понять, что это такое и как его использовать. – 2010-06-09 10:01:23

+0

Добро пожаловать :) – Manu