本文分别说明.NET CORE与Spring Boot 编写控制台程序应有的“正确”方法,以便.NET程序员、JAVA程序员可以相互学习与加深了解,注意本文只介绍用法,不会刻意强调哪种语言或哪种框架写的控制台程序要好。
本文所说的编写控制台程序应有的“正确”方法,我把正确二字加上引号,因为没有绝对的正确,因人而异,因系统设计需求而异,我这里所谓的正确方法是指使用面向对象,依赖注入IOC,切面控制AOP等编码规范来提升程序的性能、整洁度、可读性、可维护性等,最终达到让人感觉有点高大上,有点优雅的样子。
先来说说.NET CORE编写控制台程序,目前网络上大把的讲解ASP.NET CORE的编写规范,反而对于.NET CORE控制台程序编写规范介绍比较少,大多停留在Hello Word 程序中,而本文则来讲讲.NET CORE控制台的编写规范(应有的优雅姿势)^ v ^
如果说不讲什么IOC,DI,AOP等,不讲扩展性,规范性,全部面向过程(方法)编程,那估计没什么好讲的,因为无非就是定义一个class,然后在class中定义一堆的method(方法),如果在方法中需要使用到其它第三方组件,则直接单独引用,引用后进行简单封装util工具类的静态方法,甚至也不用封装,直接使用原生的方法,总之全部都是方法调方法。而这里所演示的编写控制台方法均是尽可能的使用.NET CORE所具有的特性,只有这样才能体现出.NET CORE框架的优势,否则普通控制台程序与.NET CORE控制台程序有什么区别。
编写.NET CORE控制台程序优雅姿势一:(直接使用.NET CORE的 IOC、Logging、Config组件)
代码如下:
//Program.cs
using Microsoft.Extensions.DependencyInjection;
using System;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Configuration;
using System.IO;
namespace NetCoreConsoleApp
{
class Program
{
static void Main(string[] args)
{
//设置config文件
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appSettings.json", optional: true, reloadOnChange: true).Build();
//设置依赖注入
var provider = new ServiceCollection()
.AddLogging(configLogging => //设置日志组件
{
configLogging.SetMinimumLevel(LogLevel.Information);
configLogging.AddConsole();
})
.AddScoped<IConfiguration>(p => config)
.AddScoped<HostService>()
.BuildServiceProvider();
var hostService = provider.GetService<HostService>();
hostService.RunAsync();//统一入口服务
Console.WriteLine("提示:程序已正常启动运行,按任意键停止运行并关闭程序...");
Console.ReadLine();
}
}
}
//HostService.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace NetCoreConsoleApp
{
public class HostService
{
private readonly IConfiguration config;
private readonly ILogger<HostService> logger;
public HostService(IConfiguration config, ILogger<HostService> logger)
{
this.config = config;
this.logger = logger;
}
public void RunAsync()
{
Task.Run((Action)Execute);
}
/// <summary>
/// 控制台核心执行入口方法
/// </summary>
private void Execute()
{
//TODO 业务逻辑代码,如下模拟
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 1; i <= 100; i++)
{
Console.WriteLine("test WriteLine:" + i);
Thread.Sleep(100);
}
stopwatch.Stop();
logger.LogInformation("Logging - Execute Elapsed Times:{}ms", stopwatch.ElapsedMilliseconds);
}
}
}