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

  • 相关阅读:
    初试 spring web mvc
    读取网络数据缓存在本地 流程图
    servlet 过滤器实现 请求转发(跳转);跨域转发请求;tomcat 环境下。
    C# .net基于Http实现web server(web服务)
    微信公众平台开发
    Linux目录结构及作用
    MySQL事件调度器event的使用
    MySQL触发器trigger的使用
    存储过程的查、改、删
    MySQL游标的简单实践
  • 原文地址:https://www.cnblogs.com/dudu/p/5552293.html
Copyright © 2011-2022 走看看