Как ссылаться на класс, который реализует определенный интерфейс? - PullRequest
3 голосов
/ 09 июня 2010

У меня есть интерфейс для регистрации исключений, т.е. IExceptionLogger.

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

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

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

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

Ответы [ 5 ]

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

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

3 голосов
/ 09 июня 2010
//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 
  }
}
3 голосов
/ 09 июня 2010

Вы можете использовать шаблон «Фабрика» (класс, ответственным за создание класса IExceptionLogger) или, в более общем смысле, платформу Inversion of Control.

2 голосов
/ 09 июня 2010
IExceptionLogger logger = new DBExceptionLogger();

, затем передайте logger переменную всем вашим классам, которые записывают информацию о регистрации.

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

Вы можете использовать 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;
    }
}
...