【问题标题】:How to reference a class that implements certain interface?如何引用实现某个接口的类?
【发布时间】:2010-06-09 11:02:17
【问题描述】:

我有一个记录异常的接口,即IExceptionLogger

此接口有 3 个实现:DBExceptionLoggerXMLExceptionLoggerCSVExceptionLogger

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

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

我不能直接引用DBExceptionLogger,因为它会破坏拥有IExceptionLogger 接口的目的。

【问题讨论】:

    标签: c# interface code-reuse


    【解决方案1】:

    你应该看看inversion of controldependency injection 的概念。这些将帮助您注入实现您的接口的对象的特定实例,您的代码需要确切地知道它是什么之外的事实。在 .NET 中有许多库可以帮助您:Unity、Spring.NET、Autofac、LinFu 等等。

    【讨论】:

    • 这是唯一的方法吗?理想情况下,我不想使用任何非 .Net 库。
    • 我提到的都是.NET库。
    【解决方案2】:
    //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】:

    您可以使用工厂模式(一个负责创建IExceptionLogger 类的类),或者更一般地说,控制反转框架。

    【讨论】:

      【解决方案4】:
      IExceptionLogger logger = new DBExceptionLogger();
      

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

      【讨论】:

        【解决方案5】:

        您可以将Poor Man's 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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 2019-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多