zoukankan      html  css  js  c++  java
  • 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制不了解,竟然无从下手。

    今天正准备阅读 Microsoft.Extensions.DependencyInjection 的源代码,发现园子里的一篇博文 ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection,读后豁然开朗,遇到的问题也随之解决。

    在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollection接口进行注入即可,其它的无需关心。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IMemcachedClient, MemcachedClient>();
    }

    而在控制台程序中就不一样了,除了注入外,你还需要构建容器,解析注入。注入通过IServiceCollection接口,而构建容器需要调用IServiceCollection的扩展方法BuildServiceProvider(),解析需要调用IServiceProvider的扩展方法GetService<T>()。示例代码如下:

    public class Program
    {
        public static void Main(string[] args)
        {
            IServiceCollection services = new ServiceCollection();
            //注入
            services.AddTransient<IMemcachedClient, MemcachedClient>();
            //构建容器
            IServiceProvider serviceProvider = services.BuildServiceProvider();
            //解析
            var memcachedClient = serviceProvider.GetService<IMemcachedClient>();
            Console.WriteLine(memcachedClient);
        }
    }

    上面的代码在运行时却出现了下面的错误:

    No constructor for type 'Enyim.Caching.MemcachedClient' can be instantiated using services from the service container and default values.

    这是由于MemcachedClient的构造函数依赖ILoggerFactory接口:

    public class MemcachedClient : IMemcachedClient
    {
        public MemcachedClient(ILoggerFactory logggerFactory)
        {
            _loggger = logggerFactory.CreateLogger<MemcachedClient>();
        }
    }

    在ASP.NET Core中,由于ASP.NET Core runtime已经帮你默认注册了ILoggerFactory的实现,所以不需要自己注册,但在控制台程序中需要自己动手,添加如下的注入代码:

    services.AddTransient<ILoggerFactory, LoggerFactory>();

    在.NET Core控制台程序中使用依赖注入的问题就这么解决了。

  • 相关阅读:
    03-es6语法 Promise 和 es8语法 async await 的了解和基本使用
    02-遍历数组的方法
    01-操作数组的方法
    position 几个属性的作用
    javascript---split 和 join 的区别
    微信sdk (1)
    php获取post参数的几种方式
    linux循环递归设置权限
    php汉字截取
    php汉字生成首字母
  • 原文地址:https://www.cnblogs.com/dudu/p/5552293.html
Copyright © 2011-2022 走看看