2010-06-09 2 views
3

У меня есть интерфейс для регистрации исключений, то есть IExceptionLogger.Как ссылаться на класс, реализующий определенный интерфейс?

Этот интерфейс имеет 3 реализации: DBExceptionLogger, XMLExceptionLogger, CSVExceptionLogger.

У меня есть приложение, которое будет использовать DBExceptionLogger.

Только ссылки на приложения IExceptionLogger. Как создать экземпляр DBExceptionLogger в приложении.

Я не могу сослаться на DBExceptionLogger непосредственно, так как это нарушит цель использования интерфейса IExceptionLogger.

ответ

3
//Usage of logger with factory 
IExceptionLogger logger = ExceptionLoggerFactory.GetLogger(); 

public static class ExceptionLoggerFactory 
{ 
    public static IExceptionLogger GetLogger() 
    { 
    //logic to choose between the different exception loggers 
    //e.g. 
    if (someCondition) 
     return new DBExceptionLogger(); 
    //else etc etc 
    } 
} 
+0

Найдено несколько статей по фабричной схеме. Будет реализовывать один из моих собственных сегодня днем ​​и использовать предлагаемый код. Спасибо! – 2010-06-09 11:54:19

7

Вы должны ознакомиться с концепциями inversion of control и dependency injection. Это поможет вам ввести конкретный экземпляр объекта, который реализует ваш интерфейс, а ваш код должен быть осведомлен о том, что именно за этим фактом. Есть много библиотек, которые помогут вам в .NET: Unity, Spring.NET, Autofac, LinFu, чтобы назвать лишь некоторые из них.

+0

Это единственный способ сделать это? В идеале я не хочу использовать какие-либо библиотеки .Net. – 2010-06-09 11:08:20

+0

Я упоминал все библиотеки .NET. –

3

Вы можете использовать шаблон Factory (класс, ответственный за создание класса IExceptionLogger) или, в более общем плане, структуру инверсии управления.

2
IExceptionLogger logger = new DBExceptionLogger(); 

затем передать Лог инфокодов переменную для всех ваших классов, которые пишут информацию журнала.

1

вы можете использовать DI бедняка со статическим завода, как это:

public class ExceptionLoggerFactory 
{ 
    public static IExceptionLogger GetDBLogger() 
    { 
     return new DBExceptionLogger(); 
    } 
} 

public class MyClass 
{ 
    private IExceptionLogger _logger; 

    public MyClass() : this(ExceptionLoggerFactory.GetDBLogger()) 
    { 

    } 

    public MyClass(IExceptionLogger logger) 
    { 
     _logger = logger; 
    } 
} 
Смежные вопросы