.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 文档都没有,后面再慢慢补吧。
但一个人的力量终究是有限的,特别希望大家能加入到这个项目中和我一起开发。
.NET 开源项目 Anet 介绍的更多相关文章
- .NET 开源项目 StreamJsonRpc 介绍[下篇]
阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...
- 工业通信的开源项目 HslCommunication 介绍
前言: 本项目的孵化说来也是机缘巧合的事,本人于13年杭州某大学毕业后去了一家大型的国企工作,慢慢的走上了工业软件,上位机软件开发的道路.于14年正式开发基于windows的软件,当时可选的技术栈就是 ...
- 强大的HTTP包装开源项目ASIHTTPRequest介绍
ASIHTTPRequest 是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装.它的特色功能如下: 1,下载的数据直接保存到内存或文件系统里 2,提供 ...
- 十款不容错过的Swift iOS开源项目及介绍
1.十款不容错过的Swift iOS开源项目. http://www.csdn.net/article/2014-10-16/2822083-swift-ios-open-source-project ...
- .NET 开源项目 Polly 介绍
今天介绍一个 .NET 开源库:Polly,它是支持 .NET Core 的,目前在 GitHub 的 Star 数量已经接近 5 千,它是一个强大且实用的 .NET 库. Polly 介绍 官方对 ...
- .NET 开源项目 StreamJsonRpc 介绍
StreamJsonRpc 是一个实现了 JSON-RPC 通信协议的开源 .NET 库,在介绍 StreamJsonRpc 之前,我们先来了解一下 JSON-RPC. JSON-RPC 介绍 JSO ...
- 开源项目android-uitableview介绍
在iOS应用中,UITableView应该是使用率最高的视图之一了.iPod.时钟.日历.备忘录.Mail.天气.照片.电话.短信. Safari.App Store.iTunes.Game Cent ...
- .NET 开源项目 StreamJsonRpc 介绍[中篇]
阅读本文大概需要 11 分钟. 上一篇介绍了一些预备知识,包括 JSON-RPC 介绍和实现了 JSON-RPC 的 StreamJsonRpc 介绍,讲到了 StreamJsonRpc 可以通过 . ...
- 08_android入门_android-async-http开源项目介绍及用法
android-async-http开源项目可以是我们轻松的获取网络数据或者向server发送数据.使用起来很easy,关于android-async-http开源项目的介绍内容来自于官方:http: ...
随机推荐
- 痞子衡嵌入式:一表全搜罗常见短距离无线通信协议(Wi-Fi/Bluetooth/ZigBee/Thread...)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是常见短距离无线通信协议. 短距离无线通信是物联网的基础,随着物联网IoT的火热发展,各种短距离无线通信协议也是层出不穷,这些协议标准各有 ...
- CSS float的相关图文详解(一)
大家好,作为一个刚入门的小前端,第一次写博客,很是鸡冻.由于涉猎较浅,有些知识可能说的不清楚,或者有什么错误,欢迎留言指正.我的第一篇博客写的关于css的浮动的.想必很多小伙伴特别是刚学的,对浮动有一 ...
- 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer ...
- php 日期时间类型带毫秒
<?php date_default_timezone_set('PRC'); $mtimestamp = sprintf("%.3f", microtime(true)); ...
- Java学习笔记之——异常处理
1.异常: 在程序运行时,发生了一些错误导致程序不能正常结束或者中断 2.异常导致的后果 Java程序的执行过程中如果出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交 ...
- 面向对象的一小步:添加ActiveRecord的Scope功能
问题场景 我们用Yii2的ActiveRecord功能非常的方便,假如我们有个Model叫Student,那么ActiveQuery可以通过这种方式轻便地获得: $query = Student::f ...
- 仿9GAG制作过程(一)
有话要说: 准备开始学习Android应用程序的一个完整的设计过程.准备做一个仿9GAG的APP,前端界面设计+后台数据爬虫+后台接口设计,整个流程体验一遍.今天准备先把前端界面的框架给完成了. 成果 ...
- linux下编译opencv
1.安装cmake:sudo apt-get install cmake 2.下载opencv-2.4.10.zip,解压 3.编译opencv cd /home/opencv-2.4.10 mkdi ...
- JHipster技术栈定制 - JHipster Registry配置信息加密
本文说明了如何开启和使用JHipster-Registry的加解密功能. 1 整体规划 1.1 名词说明 名词 说明 备注 对称加密 最快速.最简单的一种加密方式,加密(encryption)与解密( ...
- Yii2.0调用sql server存储过程并获取返回值
1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...