.NET Core应用框架AA介绍(二)
AA的开源地址
https://github.com/ChengLab/AAFrameWork
AA框架是一个基础应用框架,是建立在众多大家熟知的流行工具之上并与之集成。比如:ASP.NET Core、Automapper、Dapper、Dapper-FluentMap、RabbitMQ、Redis、MassTransit、Log4net等等
大家可以很方便的去使用,学习成本很低,也易于扩展。目标能做成一个大家都能吼得住、可以自己改进的框架。
AA这个名字来源于AA制,一起贡献于社区才能从社区获取果实。
基于AA创建一个示例demo
示例demo 很简单,创建一个任务管理的模块,包含增删改查的功能。
示例项目架构图
示例项目截图
准备工作
数据库脚本:
CREATE TABLE [dbo].[QuartzJobdetail]( [Id] [int] IDENTITY(1,1) NOT NULL, [JobGroup] [varchar](100) NULL, [JobName] [varchar](100) NULL, [RunStatus] [int] NULL, [Cron] [varchar](100) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL, [Description] [varchar](100) NULL, [GmtCreateTime] [datetime] NULL, [ApiUrl] [varchar](100) NULL, [Status] [int] NULL, CONSTRAINT [PK_QUARTZJOBDETAIL] PRIMARY KEY CLUSTERED( [Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO
基础设施层
配置数据库连接 和指定数据库类型
public AADapperContent() : base(new NameValueCollection() { ["aa.dataSource.AaBase.connectionString"] = "Data Source =.; Initial Catalog = QuartzAA-Job;User ID = sa; Password = 123;", ["aa.dataSource.AaBase.provider"] = "SqlServer" }) { }
配置领域实体和数据库表映射
public class QuartzJobdetailMap:DommelEntityMap<QuartzJobdetail> { public QuartzJobdetailMap() { ToTable("QuartzJobdetail");
Map(x=>x.Id).IsKey().IsIdentity(); } }
实现仓储层
public class QuartzJobdetailRepository:DapperRepository<QuartzJobdetail>, IQuartzJobdetailRepository { public IPage<QuartzJobdetailDto> GetListReturnOrder(GetListQuartzJobDetailInput input) { object sqlParam = null; var sql = new StringBuilder(); sql.Append("select * from QuartzJobdetail "); sql.Append(" where 1=1"); var result = DapperContext.Current.DataBase.GetPage<QuartzJobdetailDto>(new PageRequest { PageIndex = input.PageIndex, PageSize = input.PageSize, SqlText = sql.ToString(), SqlParam = sqlParam, OrderFiled = " Id desc ", }); return result; } }
DapperRepository 实现了IDapperRepository接口,IDapperRepository接口代码如下
public virtual bool Delete(TEntity entity); public virtual Task<bool> DeleteAsync(TEntity entity); public virtual bool DeleteMultiple(Expression<Func<TEntity, bool>> predicate); public virtual Task<bool> DeleteMultipleAsync(Expression<Func<TEntity, bool>> predicate); public virtual TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate); public virtual Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate); public virtual TEntity Get(object id); public virtual IEnumerable<TEntity> GetAll(); public virtual Task<IEnumerable<TEntity>> GetAllAsync(); public virtual Task<TEntity> GetAsync(object id); public virtual object Insert(TEntity entity); public virtual Task<object> InsertAsync(TEntity entity); public virtual IEnumerable<TEntity> Select(Expression<Func<TEntity, bool>> predicate); public virtual Task<IEnumerable<TEntity>> SelectAsync(Expression<Func<TEntity, bool>> predicate); public virtual bool Update(TEntity entity); public virtual Task<bool> UpdateAsync(TEntity entity);
领域层
示例项目,比较简单,并没有完全按照DDD去实现领域服务,领域事件等等,这里主要演示如何基于AA基础框架创建一个项目。领域模型(贫血)代码如下
public class QuartzJobdetail { /// <summary> /// 编号 /// </summary> public int Id { get; set; } /// <summary> /// 任务组 /// </summary> public string JobGroup { get; set; } /// <summary> /// 任务名称 /// </summary> public string JobName { get; set; } /// <summary> /// 运行状态 /// </summary> public int RunStatus { get; set; } /// <summary> /// cron表达式 /// </summary> public string Cron { get; set; } /// <summary> /// 开始日期 /// </summary> public DateTime StartTime { get; set; } /// <summary> /// 结束日期 /// </summary> public DateTime EndTime { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } /// <summary> /// 创建日期 /// </summary> public DateTime GmtCreateTime { get; set; } /// <summary> /// api地址 /// </summary> public string ApiUrl { get; set; } /// <summary> /// 状态 /// </summary> public int Status { get; set; } }
仓储接口代码如下
public interface IQuartzJobdetailRepository: IDapperRepository<QuartzJobdetail> { IPage<QuartzJobdetailDto> GetListReturnOrder(GetListQuartzJobDetailInput input); }
应用层
服务接口和实现代码如下
public interface IQuartzJobdetailService { void Save(SaveQuartzJobdetailInput input); void Update(UpdateQuartzJobdetailInput input); void Remove(RemoveQuartzJobdetailInput input); QuartzJobdetailDto GetQuartzJobdetail(GetQuartzJobdetailInput input); PagedResultDto<QuartzJobdetailDto> GetList(GetListQuartzJobDetailInput input); }
public class QuartzJobdetailService : IQuartzJobdetailService { #region filed private readonly IQuartzJobdetailRepository _quartzJobdetailRepository; #endregion
#region actor public QuartzJobdetailService() { var dapperContent = new AADapperContent(); _quartzJobdetailRepository = new QuartzJobdetailRepository(); } #endregion
public void Save(SaveQuartzJobdetailInput input) { var obj = _quartzJobdetailRepository.Insert(new QuartzJobdetail { JobGroup = input.JobGroup, JobName = input.JobName, RunStatus = input.RunStatus, Cron = input.Cron, StartTime = input.StartTime, EndTime = input.EndTime, Description = input.Description, GmtCreateTime = DateTime.Now, ApiUrl = input.ApiUrl, Status = input.Status, }); }
public void Update(UpdateQuartzJobdetailInput input) { var model = _quartzJobdetailRepository.Get(input.Id); model.JobGroup = input.JobGroup; model.JobName = input.JobName; model.Cron = input.Cron; model.StartTime = input.StartTime; model.EndTime = input.EndTime; model.Description = input.Description; model.ApiUrl = input.ApiUrl; _quartzJobdetailRepository.Update(model); } public void Remove(RemoveQuartzJobdetailInput input) { var model = _quartzJobdetailRepository.Get(input.Id); _quartzJobdetailRepository.Delete(model); } public QuartzJobdetailDto GetQuartzJobdetail(GetQuartzJobdetailInput input) { var model = _quartzJobdetailRepository.FirstOrDefault(p => p.Description.Contains(input.Description)); return new QuartzJobdetailDto() {
JobGroup = model.JobGroup, JobName = model.JobName, RunStatus = model.RunStatus, Cron = model.Cron, StartTime = model.StartTime, EndTime = model.EndTime, Description = model.Description, ApiUrl = model.ApiUrl,
}; } public PagedResultDto<QuartzJobdetailDto> GetList(GetListQuartzJobDetailInput input) { var result = _quartzJobdetailRepository.GetListReturnOrder(input); return new PagedResultDto<QuartzJobdetailDto> { TotalCount = result.Count, Items = result.Data.ToList() }; }
表现层
控制器的代码
public IActionResult Index() { return View(); } /// <summary> /// job列表 /// </summary> /// <param name="limit">每页显示条数</param> /// <param name="start"></param> /// <param name="page">页码</param> /// <param name="draw"></param> /// <returns></returns> public IActionResult GetListQuartzJobdetail(int limit, int start, int page, int draw) { var result = _quartzJobdetailService.GetList(new GetListQuartzJobDetailInput() { PageIndex = page, PageSize = limit, });
var vm = new PageResponse<QuartzJobdetailViewModel> { draw = draw, recordsTotal = result.TotalCount, recordsFiltered = result.TotalCount, data = result.Items.MapTo<List<QuartzJobdetailViewModel>>() }; return Json(vm); } /// <summary> /// 添加 /// </summary> /// <param name="vm"></param> /// <returns></returns> public IActionResult Save(QuartzJobdetailVm vm) { _quartzJobdetailService.Save(vm.MapTo<SaveQuartzJobdetailInput>()); return Json(Result.Success("操作成功")); } /// <summary> /// 编辑 /// </summary> /// <param name="vm"></param> /// <returns></returns> public IActionResult Update(QuartzJobdetailVm vm) { _quartzJobdetailService.Update(vm.MapTo<UpdateQuartzJobdetailInput>()); return Json(Result.Success("修改成功")); }
/// <summary> /// 删除 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpPost] public IActionResult Remove(int id) { _quartzJobdetailService.Remove(new RemoveQuartzJobdetailInput { Id = id }); return Json(Result.Success("删除成功")); }
最后运行,新增一条记录如图:
文中展示了部分代码,整个示例项目的代码会上传到github上,这个示例项目不会是最终版本,还会继续。.NET Core 3.1这个长期版本快发布了,期待ing。。。。。
.NET Core应用框架AA介绍(二)相关推荐
- .Net Core应用框架Util介绍(二)
Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...
- .Net Core应用框架Util介绍(四)
上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机. Angular应用由Ts和Html两部分构成,本文介绍第一部分. Angu ...
- .Net Core应用框架Util介绍(三)
上篇.Net Core应用框架Util介绍(二)介绍了Util的开发环境,并让你把Demo运行起来.本文将介绍该Demo的前端Angular运行机制以及目录结构. 目录结构 在VS上打开Util De ...
- (非常重要).Net Core应用框架Util介绍(学习Util)
转载地址https://blog.csdn.net/sD7O95O/article/details/82598545(看看!) 不过Util作者本人的博客地址在https://www.cnblogs. ...
- C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(二)
轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍 下面,再举一个稍微复杂的例子,它的覆盖面是足够全面的,足以一瞥面向对象编程的3个要素:数据抽象.继承和多态.通过这个例子,我们期望展现出LW_ ...
- .Net Core应用框架Util介绍(五)
上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Ma ...
- .Net Core应用框架Util介绍(一)
距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆. 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经 ...
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架--SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- Magicodes.Admin.Core开源框架总体介绍
框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...
最新文章
- 一口气发布1008种机器翻译模型,GitHub最火NLP项目大更新
- 微服务限流Sentinel讲解(二)
- 【转】QT 串口QSerialPort + 解决接收数据不完整问题
- hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
- Vue.js 组件基础
- DCMTK:表示细分对象的类
- 计算机系在职研究生 网络班,在职研究生都有网络班吗?
- Reversing-x64Elf-100
- 2k 幻14_幻14、2020雷蛇潜行版、mbp、gs66等笔记本之间的选择??
- 苹果发布 Safari 技术预览版 131,其中包含错误修复和性能改进
- 【验证码识别】基于matlab CNN卷积神经网络验证码识别【含Matlab源码 098期】
- 《统计学》第八版贾俊平第十四章指数知识点总结及课后习题答案
- h3c comware 使用 freeradius 统一认证---草稿
- Linux驱动开发(十三)---USB驱动HID开发学习(鼠标)
- Review and start again——First Period JAVA web Program hotelmanagement:6.some about JAVA factory mode
- 惠普找不到远程服务器,找不到网络打印机是怎么回事?
- 邮件安全防护之反垃圾邮件开源软件ASSP
- 巧用Mac上的Spotlight搜索
- 【为人处事】:如何识人
- matlab模拟线圈电磁场,利用MATLAB的PDE工具箱对电场和磁场进行模拟