.NET6一些常用組件的配置及使用
軟件架構(gòu)
分為模型層,服務(wù)層,接口層來做測試使用
0.如何使用IConfiguration、Environment
直接在builder后的主機(jī)中使用。
builder.Configuration; builder.Environment
1.如何使用Swagger
.NET 6 自帶模板已經(jīng)默認(rèn)添加Swagger,直接使用即可。
builder.Services.AddSwaggerGen();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
2. 如何添加EFCore到.NET 6中
按照EFCore常規(guī)使用方法,申明表的Entity及Dbcontext后,在program.cs文件中添加
builder.Services.AddDbContext<Service.DataContext>(opt => {
opt.UseSqlServer(builder.Configuration.GetConnectionString("Default"));
});
即可在其他地方注入使用 DataContext
使用Sqlite數(shù)據(jù)庫,需要引用 Microsoft.EntityFrameworkCore.Sqlite,并在添加服務(wù)時,改為
opt.UseSqlite(builder.Configuration.GetConnectionString("Default"));
包管理控制臺數(shù)據(jù)庫結(jié)構(gòu)生成方法:
- 使用 add-migration 創(chuàng)建遷移
- 使用 update-database 更新數(shù)據(jù)結(jié)構(gòu)
3.如何注入一個服務(wù)
builder.Services.AddScoped<UserIdentyService>();
4.如何定義全局的using引用
在根目錄下新建一個 cs文件,比如Globalusing.cs,在里面添加你的全局引用,和常規(guī)引用不同的是,在using前面添加 global
global using Service; global using Entity; global using Entity.Dto;
5.如何使用Autofac
添加 Nuget 引用
Autofac.Extensions.DependencyInjection
program.cs文件添加autofac的使用和注入配置
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
Assembly assembly = Assembly.Load("Service.dll");
builder.RegisterAssemblyTypes(assembly)
//.AsImplementedInterfaces()// 無接口的注入方式
.InstancePerDependency();
});
此時即可構(gòu)造函數(shù)注入使用。
6.如何使用Log4Net
添加引用
Microsoft.Extensions.Logging.Log4Net.AspNetCore
新建配置文件 log4net.config;
添加service配置
//注入Log4Net
builder.Services.AddLogging(cfg =>
{
//默認(rèn)的配置文件路徑是在根目錄,且文件名為log4net.config
//cfg.AddLog4Net();
//如果文件路徑或名稱有變化,需要重新設(shè)置其路徑或名稱
//比如在項目根目錄下創(chuàng)建一個名為config的文件夾,將log4net.config文件移入其中,并改名為log4net.config
//則需要使用下面的代碼來進(jìn)行配置
cfg.AddLog4Net(new Log4NetProviderOptions()
{
Log4NetConfigFileName = "config/log4net.config",
Watch = true
});
});
即可在需要的地方定義使用
_logger = LogManager.GetLogger(typeof(UserController));
7.如何使用全局異常過濾器
首先新建 GlobalExceptionFilter 全局異常過濾器,繼承于 ExceptionFilter ,用于接收處理拋出的異常
public class GlobalExceptionFilter : IExceptionFilter
{
readonly IWebHostEnvironment hostEnvironment;
readonly ILog logger;
public GlobalExceptionFilter(IWebHostEnvironment _hostEnvironment)
{
this.hostEnvironment = _hostEnvironment;
this.logger = LogManager.GetLogger(typeof(GlobalExceptionFilter));
}
public void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled)//如果異常沒有處理
{
var result = new ApiResult
{
Code = 500,
IsSuccess = false,
Message = "服務(wù)器發(fā)生未處理的異常"
};
if (hostEnvironment.IsDevelopment())
{
result.Message += "," + context.Exception.Message;
result.Data = context.Exception.StackTrace;
}
logger.Error(result);
context.Result = new JsonResult(result);
context.ExceptionHandled = true;//異常已處理
}
}
}
然后在Service中添加全局異常過濾器
builder.Services.AddControllers(option =>
{
option.Filters.Add<GlobalExceptionFilter>();
}
);
添加控制器方法完成測試
[HttpGet("exception")]
public ApiResult ExceptionAction()
{
throw new NotImplementedException();
}
8.如何使用redis做緩存
使用 StackExchange.Redis 作為緩存組件(其他組件類似的使用方式)。nuget 安裝 StackExchange.Redis.Extensions.Core
首先,先建立一個類 RedisClient ,用于管理redis的連接和操作,再建立一個 RedisClientFactory 類,用于創(chuàng)建 redis的連接;
public class RedisClient{...}
public class RedisClientFactory{...}
appsettings.json 中添加redis的配置
"RedisConfig": {
"Redis_Default": {
"Connection": "127.0.0.1:6379",
"InstanceName": "Redis1:"
},
"Redis_6": {
"Connection": "127.0.0.1:6379",
"DefaultDatabase": 6,
"InstanceName": "Redis2:"
}
}
service中添加 redis客戶端的引用
//添加redis的使用 builder.Services.AddSingleton<RedisClient>(_=> RedisClientFactory.GetInstance(builder.Configuration));
一頓操作后,就可以在你想要使用redis的地方引用了
RedisClient redisClient
...
this.redisDb = redisClient.GetDatabase("Redis_Default");
redisDb.StringSet("clientId", "clientId", TimeSpan.FromSeconds(10));
要使用redis做分布式緩存,先引用 Microsoft.Extensions.Caching.StackExchangeRedis
//將Redis分布式緩存服務(wù)添加到服務(wù)中
builder.Services.AddStackExchangeRedisCache(options =>
{
//用于連接Redis的配置 Configuration.GetConnectionString("RedisConnectionString")讀取配置信息的串
options.Configuration = "Redis_6";// Configuration.GetConnectionString("RedisConnectionString");
//Redis實例名RedisDistributedCache
options.InstanceName = "RedisDistributedCache";
});
引用自 "分布式 Redis 緩存"
9 如何添加使用定時任務(wù)組件
此處使用 Hangfire 定時任務(wù)組件,輕便,可持久化,還有面板。
引用 Hangfire 后,即可新增定時任務(wù)。
//啟用Hangfire服務(wù).
builder.Services.AddHangfire(x => x.UseStorage(new MemoryStorage()));
builder.Services.AddHangfireServer();
...
//啟用Hangfire面板
app.UseHangfireDashboard();
//開啟一個定時任務(wù)
RecurringJob.AddOrUpdate("test",() => Console.WriteLine("Recurring!"), Cron.Minutely());
訪問 https://localhost:7219/hangfire 即可看到任務(wù)面板
10. 如何使用業(yè)務(wù)鎖鎖住下單或者支付操作
首先,做這個事需要能先構(gòu)建出一個鎖出來,這個鎖有個鎖的標(biāo)識key,可以根據(jù)這個key判定key對應(yīng)的鎖是否存在,這樣的話,在某個用戶支付或者下單減庫存啥的時候,就可以按照這個key先上鎖,后面有用戶走其他渠道進(jìn)行同樣的操作的時候,就可以根據(jù)是否上鎖了,來判斷操作能否繼續(xù)。
比如一個支付訂單的業(yè)務(wù),可以在手機(jī)上操作,也可以在電腦上操作,這個時候就可以給支付接口上鎖,只要一個支付過程存在著,并且沒有超時,那就不能在其他渠道進(jìn)行操作。
我們上面已經(jīng)使用了redis,下面就用redis構(gòu)建個鎖來模擬這個操作,具體看代碼:
/// <summary>
/// 測試業(yè)務(wù)鎖
/// </summary>
/// <returns></returns>
[HttpGet("lockhandle")]
public async Task<ApiResult> LockHandle(int userId)
{
var key = "user";
var token = $"ID:{userId}";
try
{
if (redisDb.LockTake(key, token, TimeSpan.FromSeconds(50)))
{
await Task.Delay(30 * 1000);
return await Task.FromResult(ApiResult.Success($"ID:{userId} 獲取到鎖了,操作正常,connectId:{Request.HttpContext.Connection.Id}"));
}
else
{
return await Task.FromResult(ApiResult.Fail($"有正在操作的鎖,connectId:{Request.HttpContext.Connection.Id}"));
}
}
catch (Exception)
{
throw;
}
finally
{
redisDb.LockRelease(key, token);
}
}
11. 如何配置跨域
此處主要記錄全局跨域,不包括指定api跨域。先增加一個配置 "Cors": "http:127.0.0.1:5001",配置可以跨域的url,也可以使用默認(rèn)跨域配置。
host配置以下服務(wù),按需使用:
builder.Services.AddCors(delegate (CorsOptions options)
{
options.AddPolicy("CorsPolicy", delegate (CorsPolicyBuilder corsBuilder)
{
//指定url跨域
corsBuilder.WithOrigins(builder.Configuration.GetValue<string>("Cors").Split(','));
//默認(rèn)跨域
corsBuilder.SetIsOriginAllowed((string _) => true).AllowAnyMethod().AllowAnyHeader()
.AllowCredentials();
});
});
12. 如何使用NewtonsoftJson
.NET6 默認(rèn)的系列化庫是內(nèi)置的 System.Text.Json,使用中如果有諸多不熟悉的地方,那肯定是想換回 NewtonsoftJson,需要nuget 引用 Microsoft.AspNetCore.Mvc.NewtonsoftJson 來配置使用,常用配置包括日期格式、大小寫規(guī)則、循環(huán)引用配置。。。等,下面是一個配置
builder.Services.AddControllers(option =>
{
option.Filters.Add<GlobalExceptionFilter>();
}
).AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); //序列化時key為駝峰樣式
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;//忽略循環(huán)引用
});
13. 如何使用SignalR
首先添加一個 ChatHub 作為 交互中心處理器
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
在主機(jī)中使用服務(wù)
builder.Services.AddSignalR();
...
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chatHub");
});
到此這篇關(guān)于.NET6一些常用組件的配置及使用的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.Net創(chuàng)建型設(shè)計模式之工廠方法模式(Factory?Method)
這篇文章介紹了.Net設(shè)計模式之工廠方法模式(Factory?Method),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
ASP.NET 5已終結(jié),迎來ASP.NET Core 1.0和.NET Core 1.0
命名是非常困難的事情,微軟這次為了和ASP.NET4.6做區(qū)分,采用了全新的命名方式ASP.NET Core 1.0,它是一個全新的框架。2016-03-03
System.Diagnostics.Metrics .NET 6 全新指標(biāo)API講解
本文詳細(xì)講解了.NET 6全新指標(biāo)System.Diagnostics.Metrics,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
IIS7 應(yīng)用程序池的 托管管道模式與集成模式小結(jié)
而 IIS 7 完全整合 .NET 之后,架構(gòu)的處理順序有了很大的不同(如下圖),最主要的原因就是 ASP.NET 從 IIS 插件(ISAPI extension)的角色,進(jìn)入了 IIS 核心,而且也能以 ASP.NET 模塊負(fù)責(zé)處理 IIS 7 的諸多類型要求。2011-02-02
.Net行為型設(shè)計模式之策略模式(Stragety)
這篇文章介紹了.Net行為型設(shè)計模式之策略模式(Stragety),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
.NET?Core使用flyfire.CustomSerialPort實現(xiàn)Windows/Linux跨平臺串口通訊
本文詳細(xì)講解了.NET?Core使用flyfire.CustomSerialPort實現(xiàn)Windows/Linux跨平臺串口通訊的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01

