我们都知道,在 ASP.NET CORE 中通过依赖注入的方式来使用服务十分的简单,而在 Console 中,其实也只是稍微绕了个小弯子而已。不管是内置 DI 组件或者第三方的 DI 组件(如Autofac),通过 IServiceCollection 接口我们都可以做到和应用程序的无缝连接。本文将在别给出内置组件和第三方组件(主要是Autofac)在 Console 应用程序中的依赖注入实现方式。

  1. 在 Console 中使用内置 DI 组件

  • 网上已经有几篇相关的博客讲解 Console 中的依赖注入,链接都会附于文章末尾。不像 ASP.NET CORE 在应用框架启动时便将 DI 容器初始化完成并且注入了大部分开发者需要的服务,我们只能从零开始。
// 安装 DI 组件
Install-Package Microsoft.Extensions.DependencyInjection
// 安装日志输出组件
Install-Package Microsoft.Extensions.Logging.Console
  • 添加模拟的应用服务
public interface ICounterAppService
{
void Count(int loops);
} public class CounterAppService : ICounterAppService
{
private readonly ILogger _logger; public CounterAppService(ILoggerFactory logger)
{
_logger = logger.CreateLogger<CounterAppService>();
} public void Count(int loops)
{
for (var i = 0; i < loops; i++)
_logger.LogInformation($"We have got the {i} Loop");
}
}
  • Program 中对 DI 组件的初始化和服务的注册
private static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddLogging()
.AddSingleton<ICounterAppService, CounterAppService>()
.BuildServiceProvider(); serviceProvider
.GetService<ILoggerFactory>()
.AddConsole(LogLevel.Debug); var logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogDebug("Starting application"); var counter = serviceProvider.GetService<ICounterAppService>();
counter.Count(10); logger.LogDebug("All done!");
}

我们手动创建 serviceProvider 的过程其实就是 ASP.NET CORE 执行 ConfigureServices 方法的过程,同样的,上述代码也展示了手动解析 Logger 实例和通过构造函数注入解析 Logger 实例的两种方式。其中 AddLogging 方法的背后代码如下所示:

public static IServiceCollection AddLogging(this IServiceCollection services)
{
if (services == null)
throw new ArgumentNullException("services");
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof (ILogger<>), typeof (Logger<>)));
return services;
}
  1. 在 Console 中使用第三方 Autofac DI 组件

笔者曾经写过在 ASP.NET CORE 使用 Autofac 组件的例子,而在 Console 中,注册流程也没有什么变化。以下是 Program 中的代码

private static void Main(string[] args)
{
var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(); var containerBuilder = new ContainerBuilder(); // 将原本注册在内置 DI 组件中的依赖迁移入 Autofac 中
containerBuilder.Populate(serviceCollection); // 也可以把 ICounterAppService 预先注入到内置 DI 中再使用 Populate 方法迁移
containerBuilder.RegisterType<CounterAppService>().As<ICounterAppService>(); var container = containerBuilder.Build();
var serviceProvider = new AutofacServiceProvider(container); serviceProvider
.GetService<ILoggerFactory>()
.AddConsole(LogLevel.Debug); var logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogDebug("Starting!"); var counter = serviceProvider.GetService<ICounterAppService>();
counter.Count(10); logger.LogDebug("Done!");
}

同时,Autofac中也提供了诸如 RegisterAssemblyTypes 的方法用于程序集中服务的批量注入,这也是第三方容器的优势所在。

Using dependency injection in a .Net Core console application

ASP.NET Core Dependency Injection Deep Dive

.NET CORE——Console中使用依赖注入的更多相关文章

  1. ASP.NET Core 过滤器中使用依赖注入

    如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 一般自定义的过滤器直接用特性方式标识就能使用 [ContentFilter] 因为构造函数在使用的时候要求传参,然后我们可 ...

  2. 在.NET Core控制台程序中使用依赖注入

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

  3. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  4. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  5. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  6. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  7. Asp.net core中的依赖注入

    使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式. public Va ...

  8. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  9. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

随机推荐

  1. JavaScript实现图片拖拽、粘贴上传

    前些日子为老婆做了一个web管理商品的工具,因为商品的图片比较多并且还需要剪裁图,为了上传图片方便加了一个拖拽.粘贴上传的功能. 我已经把代码整理出来放到GitHub上了,有兴趣的朋友可以下来玩玩. ...

  2. 在Ubuntu中设置DNS域名服务器端

    在Ubuntu中设置DNS域名服务器主要有四种方法: 一.设置全局静态DNS $ sudo vi /etc/resolvconf/resolv.conf.d/base(这个文件默认是空的),插入: n ...

  3. Javascript 严格模式use strict

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立”严格模式”的目 ...

  4. 石头剪刀布 R语言统计分析

    关于石头剪刀布,做出了详细的分析,具体ppt见地址 http://files.cnblogs.com/files/GMGHZ971322/R%E8%AF%AD%E8%A8%80.pptx 16级电商三 ...

  5. R语言统计分析技术研究 特征值选择技术要点

    特征值选择技术要点                          作者:王立敏 文章来源:  网络 1.特征值 特征值是线性代数中的一个重要概念.在数学,物理学,化学,计算机等领域有着广泛的应用. ...

  6. ecshop开发帮助

    http://www.ecshop.com/template_tutorial/ ECSHOP模板结构说明 http://help.ecshop.com/index.php ECSHOP帮助中心 ht ...

  7. 什么是Css Hack?ie6,7,8的hack分别是什么?

    针对不同的浏览器写不同的CSS code的过程,就是CSS hack. 示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 #test       { width:300px; heig ...

  8. 学容器必须懂 bridge 网络 - 每天5分钟玩转 Docker 容器技术(32)

    上一节我们讨论了 none 和 host 类型的容器网络,本节学习应用最广泛也是默认的 bridge 网络. Docker 安装时会创建一个 命名为 docker0 的 linux bridge.如果 ...

  9. java中volatile不能保证线程安全

    今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而 ...

  10. 理解容器之间的连通性 - 每天5分钟玩转 Docker 容器技术(34)

    通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性. 两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下: ...