《深入浅出.NET框架设计与实现》阅读笔记(一)

.NET CLI概述

命令 说明
dotnet add 将包或引用添加到.NET项目中
dotnet build 构建.NET项目,并编译为IL二进制文件
dotnet clean 清理.NET项目的构建输出
dotnet help 显示命令行帮助
dotnet list 罗列项目中的yinyong
dotnet publish 发布项目,用于部署
dotnet sln 修改解决方案文件

Service Create(sc)

用于服务管理的命令行工具,可以用于添加新服务,也可以用于查询、修改、启动、停止和删除现有服务。命令行中使用如下:

sc.exe create ....

WebAPI托管为Windows服务

需要修改WebAPI项目的program.cs文件,创建一个WebApplicationOptions对象,并且将ContentRootPath属性设置为AppContext.BaseDirectory.

WebApplicationOptions opt = new ()
{
	ContentRootPath=AppContext.BaseDirectory,
	Args = args
};
var builder = WebApplication.CreateBuilder(opt);
builder.Host.UseWindowsService();

项目发布后,在Windows服务器上使用sc命令行工具创建Windows服务,服务的名字为WebAPIService

sc.exe create WebAPIService binpath=发布的文件夹地址

依赖注入的生命周期

Singleton

单例生命周期,在整个程序运行周期内,只会创建一次对象。

Scoped

作用域生命周期,在每个Http请求期间创建一次对象。

Transient

瞬时生命周期,每次接口的调用都会创建一个新的对象。

依赖注入

通过WebAppliactionBuilder对象的Services去注册服务

builder.Services.AddTransient<Ixxx,xxx>();

实现批量服务注册

  • 创建一个ServiceCollection对象
  • 通过Assembly对象的Load扩展方法加载指定的程序集
  • 通过string.EndWith方法来匹配接口和方法
  • 使用AddSingleton方法注册服务
  • 调用BuildServiceProvider方法获取ServiceProvider依赖注入容器对象
var services = new ServiceCollection();
var assembly = Assembly.Load("想要指定的程序集名字");
List<Type> typeList = assembly.GetTypes().where(t=> !t.IsInterface && !t.IsAbstract && t.Name.EndsWith("自己想要自动录入的名字后缀").ToList();
var dic = new Dictionary<Type,Type[]>();
foreach(var type in typeList)
{
	var interfaces = type.GetInterfaces();
	dic.Add(type,interfaces );
}
if(dic.Keys.Count > 0)
{
	foreach(var instanceType in dic.Keys)
	{
		foreach(var interfaceType in dic[instanceType ])
		{
			services.AddSingleton(interfaceType ,instanceType );
		}
	}
}
services.BuildServiceProvider();

你可能感兴趣的:(.net,笔记)