.NET 開源專案 Anet 介紹
使用 Anet 有一段時間了,已經在我的個人網站(如 bookist.cc )投入使用,目前沒有發現什麼大問題,所以才敢寫篇文章向大家介紹。
GitHub 地址: https://github.com/anet-team/anet
Anet 是一個 .NET Core 通用框架,特點是簡單易用。它的目標是:
A .NET Core Common Lib, Framework and Boilerplate.
它的取名正是來自於這個定義的前面四個字母:ANET。Anet 的宗旨是使 .NET 專案開發變得簡單和快速。它適用於面向微服務開發 WebAPI、服務程式和網站。
Anet 說是框架,其實特別簡單,幾乎沒有學習成本。
為什麼選擇 Anet
很多傳統的 .NET 開源框架模板(比如 ABP)都比較重,學習成本高,使用起來條條框框,比較麻煩。而 Anet 就簡單易用得多,尤其適合面向微服務快速開發。
和其它模板框架一樣,Anet 封裝了一些實用工具類,集成了輕量 ORM 框架 Dapper。但 Anet 對 Dapper 做了一些改進,使得事務可以放在業務層獨立處理,資料訪問層則不需要關心事務(下文有示例)。
Anet 的使用
下面貼一些 Anet 的使用示例,這些示例程式碼都可以在 Anet 的 GitHub 倉庫中找到。
使用前先安裝 Nuget 包:
Install-Package Anet # 或者 dotnet add package Anet
1. 查詢操作
public class UserRepository : RepositoryBase<AnetUser> { public UserRepository(Database db) : base(db) { } public Task<IEnumerable<UserResponseDto>> GetAllAsync() { var sql = "SELECT * FROM AnetUser;"; return Db.QueryAsync<UserResponseDto>(sql); } public Task<UserResponseDto> GetByIdAsync(long id) { var sql = Sql.Select("AnetUser", new { Id = id }); return Db.QueryFirstOrDefaultAsync<UserResponseDto>(sql); } }
2. 新增操作
public class UserService { private readonly UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public async Task CreateUserAsync(UserRequestDto dto) { var newUser = new AnetUser { UserName = dto.UserName }; using (var tran = userRepository.BeginTransaction()) { await userRepository.InsertAsync(newUser); // Other business logic code. tran.Commit(); } } // ...(其它程式碼) }
3. 更新操作
public class UserService { private readonly UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public async Task UpdateUserAsync(long userId, UserRequestDto dto) { var user = await userRepository.FindAsync(userId); if (user == null) throw new NotFoundException(); using(var tran = userRepository.BeginTransaction()) { await userRepository.UpdateAsync( update: new { dto.UserName }, clause: new { Id = userId }); tran.Commit(); } } // ...(其它程式碼) }
4. 刪除操作
public class UserService { private readonly UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public async Task DeleteUserAsync(long id) { var rows = await userRepository.DeleteAsync(id); if (rows == 0) throw new NotFoundException(); } // ...(其它程式碼) }
5. 定時任務
Anet 封裝了一個 JobScheduler,它可以滿足大部分任務排程的需求。下面演示如何通過 Anet 來實現一個簡單任務輪循程式,模擬一個傳送訊息的任務排程服務。這個示例也可以在 GitHub 倉庫中找到原始碼。
首先建立一個 Console(.NET Core)應用,需要先安裝 Anet 的兩個包:
Install-Package Anet Install-Package Anet.Job
要新增一個定時任務就新增一個 IJob 介面的實現。這裡新增一個 MessageJob 類,使它實現 IJob 介面,程式碼如下:
public class MessageJob : IJob { private readonly ILogger<MessageJob> _logger; public MessageJob(ILogger<MessageJob> logger) { _logger = logger; } public Task ExecuteAsync() { // 模擬非同步傳送訊息 return Task.Run(() => { _logger.LogInformation("正在傳送訊息..."); Thread.Sleep(3000); _logger.LogInformation("訊息傳送成功。"); }); } public Task OnExceptionAsync(Exception ex) { _logger.LogError(ex,"傳送訊息出錯。"); return Task.FromResult(0); } }
你要關心的就是 ExecuteAsync
方法,把你的執行程式碼放在此方法中。
然後只需在 Program.cs 的入口 Main 方法中進行初始化和配置即可,例如:
// 初始化應用 App.Init((config, services) => { // 繫結配置 Settings = new SettingsModel(); config.Bind(Settings); // 註冊服務 services.AddTransient<MessageJob>(); }); var logger = App.ServiceProvider.GetRequiredService<ILogger<Program>>(); logger.LogInformation("程式已啟動。"); // 啟動定時輪循任務 Scheduler.StartNew<MessageJob>(Settings.JobIntervalSeconds); logger.LogInformation("已啟動訊息傳送任務處理程式。"); // 等待程式關閉 Scheduler.WaitForShutdown();
一個簡單的訊息傳送服務就做好了,每隔指定秒數就會執行傳送任務。執行後在控制檯看到的效果是:
這個示例包含了記錄日誌,控制檯上的資訊都是臨時的,你也可以檢視執行目錄下的 logs 資料夾中的日誌檔案。完整程式碼請前往 GitHub 檢視。
Anet 的目前狀態
Anet 才剛起步,處在最小可用狀態。它目前只是一個通用庫,封裝了一些常用的類(比如基於 Snowflake 演算法的 Id 生成器、使用者密碼加密等),還算不上框架,還有很多事情要做,連 Wiki 文件都沒有,後面再慢慢補吧。
但一個人的力量終究是有限的,特別希望大家能加入到這個專案中和我一起開發。