Я работаю над слоем обработки исключений для своего приложения.
Я прочитал немного статей об интерфейсах и дженериках. Я использовал наследование прежде довольно много, и я доволен в той области.
У меня есть очень краткий дизайн, который я собираюсь реализовать:
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
и т.д., Чем я все еще закончу с реальными классами, которые я должен буду использовать в различных слоях моего приложения.
Вы не можете избежать наличия конкретных классов, реализующих IMyExceptionLogger. Однако вы можете запретить классам, которые должны выполнять регистрацию исключений, иметь зависимости от этих конкретных классов. Для этого и существует интерфейс. Поэтому вы внедряете регистратор в качестве зависимости от всех классов, которым необходимо его использовать:
class MyClass
{
public MyClass(IMyExceptionLogger exceptionLogger)
{
....
exceptionLogger.LogException(e);
}
}
Вы также можете рассмотреть некоторые IoC-контейнеры, такие как Unity, которые помогут вам легче управлять этими зависимостями.
Определите регистратор интерфейса и определите столько конкретных реализаций, сколько вы хотите (реализующих его).
Следующее использование композиции - в каждый класс, который должен что-то регистрировать, должен быть внедрен регистратор (через аргумент ctor или установщик).
Мне это кажется более естественным.
да, вам нужно реализовать метод LogException () в FooClass.
Преимущество интерфейсов в вашем случае в том, что вы можете создать конкретный тип регистратора (FooClass или DBExceptionLogger или около того) и передавать только ссылку IMyExceptionLogger. Так что все ваши классы, информация о которых будет регистрироваться, будут независимы от конкретной реализации регистратора.
Вы должны использовать интерфейс, скажем IExceptionLog. Если конкретные классы имеют много общего, например, XmlLogger, SOAPLogger, вы можете создать базовый класс для них. В классах, где вы хотите использовать логгер, должен быть создан член типа IExceptionLog (интерфейс). Значение этого члена устанавливается с помощью инъекции зависимостей. При желании вы можете использовать IoC containter