博主以前做Java开发,现在技术转型到.net。为了能快速熟悉、掌握.net,学以致用,所以计划做一个权限管理系统。
我们先从MVC架构做起,后面会转成DDD架构模式。这篇合集会记录整个开发过程以及碰到的问题,也会记录一些Java和.net的区别。
今天我们先从第一步入手,项目搭建。
源码地址(https://gitee.com/fz0066/quick-admin)
IDE毫无疑问选择Visual Studio 2022,框架选择.net7。
一、打开VS2022,新建项目,选择.Net Core Web Api模板(前后端分离)。
不勾选“Configure for HTTPS”。“Use controllers”建议勾选,它会帮我们自动生成一个Controller类,虽然实际项目并不会用到这个类,我们可以把它当做demo,方便测试,并可以作为参照开发我们自己的Controller类。勾选“Enable OpenApi support”会自动集成swagger框架,如不需要可不勾选(后面如果需要添加swagger也可手动添加)。
项目结构非常简洁,一个WeatherForecastController类,一个WeatherForecast实体类,还有一个Program.cs。Controller类比较简单不再详细介绍。
Program就是项目启动运行的入口,相当于main函数。但是它没有main函数,自 Visual Studio 2022 或 .NET6 开始,main被省略了,是微软的新科技叫顶级语句(Top-level statements - programs without Main methods)
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}
app.UseAuthorization();
app.MapControllers();
app.Run();
二、编译运行。
.Net Core同Spring Boot一样都是自宿主程序,不必在IIS内部托管。
.NET6 开始,.NET Croe API 项目取消了 Startup.cs 文件,在 Program.cs 文件的 中完成服务的注册和中间件的管理。但当我们项目引入很多包的时候,Program.cs 也会变得臃肿。届时我们可以把中间件的管理移植到单独的类或项目中管理(后续做到时再讲)。
三、添加需要的中间件:Serilog、SqlSugar和Autofac。
1、添加Serilog日志支持
Serilog是.Net平台上非常好用的结构化日志类库。跟log4net和nlog相比,Serilog记录结构化日志更加方便,可以对日志内容自定义格式输出,方便查询和使用。
你可能会注意到WeatherForecastController类中已经注入了Microsoft.Extensions.Logging.ILogger,如果你想移除它,可以在.csproj文件中添加如下语句。
<ItemGroup>
<Using Remove="Microsoft.Extensions.Logging" />
</ItemGroup>
通过NuGet搜索安装Serilog。安装成功,你可以在Dependecies-Packages目录下看到。
打开Program.cs,添加如下代码注入Serilog服务。
#region 初始化SerilogLog.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File(Path.Combine("Logs", @"log.txt"), rollingInterval: RollingInterval.Day) .CreateLogger();#endregion
这样可以在需要使用日志的地方直接调用Log.Debug(…)、Log.Information(…)或Log.Error(…)。
日志文件目录,自动按日期生成。
如果你习惯使用依赖注入的方式调用Serilog,在注入Serilog服务时还要额外添加一行代码。
#region 初始化
SerilogLog.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File(Path.Combine("Logs", @"quick-admin-log.txt"), rollingInterval: RollingInterval.Day)
.CreateLogger();
// 使用注入的方式添加
builder.Services.AddSingleton(Log.Logger);
#endregion
Controller中调用。
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger = logger;
}
...
_logger.Debug("log info");
2、添加ORM框架SqlSugar支持。
Sqlsugar便是.NET性能和易用性的代表之一,不同于EF的设计思想,它更加简单易用功能更全,可以说是一个性能更强、更轻量的ORM框架。
同样的方法使用NuGet搜索安装SqlSugar,然后配置数据库链接、用户名密码等等,打开appsetting.json添加如下语句。
{
"ConnectionStrings":
{
"SugarConnectString": "server=localhost;Database=test;Uid=root;Pwd=root;"
}
}
在Program.cs中注入服务。
//引入配置文
var _config = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build();
#region 注入ORM服务
builder.Services.AddScoped(options =>{
return new SqlSugarClient(new List<ConnectionConfig>() {
new ConnectionConfig() {
ConfigId = DBEnum.默认数据库, ConnectionString = _config.GetConnectionString("SugarConnectString"), DbType = DbType.MySql, IsAutoCloseConnection = true }
});
});
#endregion
建议创建一个读取配置文件的工具类,在需要用到的地方调用工具类获取配置。
好了,SqlSugar添加成功了。详细的使用方法可参考官网或者我项目的源代码。
3、添加Autofac(依赖注入框架)
为什么要用Autofac?
- 丰富注册(服务组件与实现的配置)方式:RegisterType、RegisterAssemblyTypes、Autofac.Module
- 注入方式:构造函数、属性
- 生命周期:瞬时、单例、范围
- 支持面向切面编程
首先还是安装Autofac依赖,然后在Program.cs中注入服务。
#region 使用
autofacbuilder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>{ Assembly assembly = Assembly.Load(ServiceCore.GetAssemblyName());
builder.RegisterAssemblyTypes(assembly)
// 先注册Service和DAO注入
.Where(a => (a.Name.EndsWith("Service") || a.Name.EndsWith("Dao"))) .AsImplementedInterfaces()
.InstancePerDependency()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);});
#endregion
ServiceCore源代码
public static class ServiceCore{
public static string GetAssemblyName() { Console.WriteLine(Assembly.GetExecutingAssembly().GetName().Name);
return Assembly.GetExecutingAssembly().GetName().Name;
}
}
到这里,项目创建完成了,编译运行。
后面我会专门写一篇文章介绍Autofac的使用。
源码地址(https://gitee.com/fz0066/quick-admin )
我的微信:zhouxf2719,谢绝闲聊。