c# - 使用静态记录器、静态帮助程序类进行依赖注入(inject)

标签 c# unit-testing static dependency-injection

我有一个调用静态 Logger 类的静态类,

例如

static class DoesStuffStatic
{
  public static void DoStuff()
  {
    try
    {
      //something
    }
    catch(Exception e)
    {
      //do stuff; 
      Logger.Log(e);
    }
  }
}

static class Logger
{
  public static void Log(Exception e)
  {
     //do stuff here
  }
}

如何将 Logger 注入(inject)我的静态类?

注意:我读过Dependency Injection in .NET with examples? ,但这似乎使用了一个实例记录器。

最佳答案

不一定如此。只要您的静态记录器公开以下方法:

  • 注入(inject)你想要注入(inject)的类,或者
  • 在运行 DI 容器之前在适当的方法调用中注入(inject)它(比如在 asp.net global.asax Application_Start 方法中),那么你应该没问题。

这是一个例子。参加以下 DI 类(class):

 public class Logger : ILogger
    {
        public void Log(string stringToLog)
        {
           Console.WriteLine(stringToLog);
        }
    }

    public interface ILogger
    {
        void Log(string stringToLog);
    }

这是我们的静态类,它需要一个记录器:

public static class SomeStaticClass
    {
        private static IKernel _diContainer;
        private static ILogger _logger;

        public static void Init(IKernel dIcontainer)
        {
            _diContainer = dIcontainer;
            _logger = _diContainer.Get<ILogger>();
        }


        public static void Log(string stringToLog)
        {
            _logger.Log(stringToLog);
        }


    }

现在,在您的应用程序的全局启动中(在本例中,在我的 global.asax.cs 中),您可以实例化您的 DI 容器,然后将其交给您的静态类。

public class Global : Ninject.Web.NinjectHttpApplication
    {

        protected override IKernel CreateKernel()
        {
            return Container;
        }


        static IKernel Container
        {
            get
            {
                var standardKernel = new StandardKernel();
                standardKernel.Bind<ILogger>().To<Logger>();
                return standardKernel;
            }

        }

        void Application_Start(object sender, EventArgs e)
        {
            SomeStaticClass.Init(Container);
            SomeStaticClass.Log("Dependency Injection with Statics is totally possible");

        }

很快!您现在已在静态类中启动并运行 DI。

希望对某人有所帮助。我正在重新开发一个使用大量静态类的应用程序,我们已经成功使用它一段时间了。

关于c# - 使用静态记录器、静态帮助程序类进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293489/

相关文章:

c# - 检查 StreamReader 是否有可用数据的非阻塞方式

c# - 如何创建包含自定义类的静态数组?

java - 如何调试在 Java 7 下工作但在 Java 8 下不工作的东西

node.js - 检查应该定义一个 Controller

c++ - 关于 C++ 中全局内联函数的示例

c# - 何时在 C# 中使用静态类

c# - .NET 中的 EntityFramework - 将子实体添加到现有父实体时,正在验证/添加父实体

java - 好的做法是创建一个专门用于测试的项目 Maven 模块吗?

Ruby 静态继承

c# - 如何将 AutoMapper 与 Ninject.Web.Mvc 一起使用?