本文是“项目框架构建”系列之2,要编写一个项目框架,就好像一个操作系统似的,得有一些东西可以搭载项目结构,而.net core的主机框架正是可以实现这一目的的好帮手。
简单介绍一下主机程序,我们生产系统中往往需要构建控制台应用程序、Web应用程序、后台服务、Winform窗体应用程序等,为了应对各种应用所带来的挑战,我们就很需要微软的主机系统。
微软的主机系统是指.net core或者.net 5以上的应用程序主机,这个主机允许我们使用配置、日志、依赖注入等一些常见的功能,还可以编写中间件等很多丰富功能。更为重要的是它是一种框架体系,可以随时插件式的加入各种生产应用上的功能。
一个简单的主机示例如下:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
class Program
{
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// 在这里配置应用程序的服务
services.AddHostedService<MyBackgroundService>();
});
}
// 示例后台服务
public class MyBackgroundService : BackgroundService
{
private readonly ILogger<MyBackgroundService> _logger;
public MyBackgroundService(ILogger<MyBackgroundService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Background service is running.");
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
}
}
当然这样的一个示例,并不能用于我们的项目框架结构,如何让一个主机系统应用到实际生产项目中呢?
这就是本文的主旨,搭建一个主机程序,我们需要做一些基础工作。
1.主机项目结构
我项目用Xejen做为命名空间,由此,我们就可以构建Xejen和Xejen.Hosting两个项目
Xejen做为框架的基础项目,主要放一些基础性的通用类、以及公共扩展类
Xejen.Hosting则作为主机框架项目
2.项目环境
我们将使用vs2022来编写项目,这是为了与时俱进,并使用最新的.net 8.0
3.日志项目
搭建主机项目框架,日志项目是少不了的。
所以我们要创建Xejen.Logger以及Xejen.Logger.NLog项目。
用Logger是为了使用Microsoft的日志,使用NLog是为了将热门的日志插件集成到框架项目中。
4.兼容旧版本
我们在与时俱进,使用最新技术的同时,也不要忘了向下兼容,我们最多只能兼容到.net framework4.7的版本,为什么呢?因为依赖注入至少要4.7起,我们不能失去依赖注入这项功能,所以,我们只能放弃4.7以前的版本支持。
5.引入Nuget服务器管理系统
由于我们做的是项目框架演练和交流,所以,既然是项目框架,那么Nuget服务器的搭建是少不了的。关于Nuget服务器的准备,放在下一篇先讲一下,这是一个容易的功能。
好的,今天,我们就只需要做这些就好了。
项目构建好后,如下图所示:
由于本文只适用高级程序员阅读,所以基础简单的就略过了。这些构建项目对于读者您来说,是再简单不过的了。
下面配置一段nuget打包的项目属性,您可以参考:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net8.0;net7.0;net6.0;net5.0;net48;net472;net471;net47;</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RootNamespace />
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Version>2024.1.3.1</Version>
<Authors>析锦团队</Authors>
<Company>广州市析锦服饰有限公司</Company>
<Copyright>广州市析锦服饰有限公司</Copyright>
<Description>项目框架基础,提供通用类以及公共的常用扩展方法</Description>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<WarningLevel>9999</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<WarningLevel>9999</WarningLevel>
</PropertyGroup>
</Project>
这都是简单的东西,作为高级程序员的你,这是小儿科了。只提一点,为了向下兼容,项目提供支持netstandard2.1;net8.0;net7.0;net6.0;net5.0;net48;net472;net471;net47;这几个版本,最低.net framework4.7。
祝您用餐愉快。
1-3-5 $ 3-5-5-4 带着田螺回四堡 3-5-2-4,你相信这是微吗?