• 在.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控制台程序中使用依赖注入的问题就这么解决了。

  • 相关阅读:
    mac下更改MySQL的默认编码
    pycharm使用gitlab输错密码解决办法
    Django中form组件的is_valid校验机制
    装饰器整理
    粘包
    MySQL常见数据库引擎及对比
    jtag、在线仿真器
    《如何高效学习》-整体性学习策略
    keil5到iar8的使用配置迁移
    Python3学习(1)——初步了解
  • 原文地址:https://www.cnblogs.com/dudu/p/5552293.html
Copyright © 2020-2023  润新知