如何引用实现某些接口的类?

时间:2010-06-09 11:02:17

标签: c# interface code-reuse

我有一个用于记录异常的界面,即IExceptionLogger

此界面有3个实现:DBExceptionLoggerXMLExceptionLoggerCSVExceptionLogger

我有一个可以使用DBExceptionLogger的应用程序。

该应用程序仅引用IExceptionLogger。如何在应用程序中创建DBExceptionLogger的实例。

我无法直接引用DBExceptionLogger,因为它会破坏IExceptionLogger接口的目的。

5 个答案:

答案 0 :(得分:7)

您应该查看inversion of controldependency injection的概念。这些将帮助您注入实现您的接口的对象的特定实例,您的代码需要知道超出该事实的确切内容。 .NET中有许多可以帮助您的库:Unity,Spring.NET,Autofac,LinFu,仅举几例。

答案 1 :(得分:3)

您可以使用Factory模式(一个负责创建IExceptionLogger类的类),或者更一般地说,使用Inversion of Control框架。

答案 2 :(得分: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 
  }
}

答案 3 :(得分:2)

IExceptionLogger logger = new DBExceptionLogger();

然后将 logger 变量传递给所有写日志信息的类。

答案 4 :(得分: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;
    }
}