.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(,) NOT NULL,
[JobGroup] [varchar]() NULL,
[JobName] [varchar]() NULL,
[RunStatus] [int] NULL,
[Cron] [varchar]() NULL,
[StartTime] [datetime] NULL,
[EndTime] [datetime] NULL,
[Description] [varchar]() NULL,
[GmtCreateTime] [datetime] NULL,
[ApiUrl] [varchar]() 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的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...
- .Net Core应用框架Util介绍(六)
前面介绍了Util是如何封装以降低Angular应用的开发成本. 现在把关注点移到服务端,本文将介绍分层架构各构造块及基类,并对不同层次的开发人员应如何进行业务开发提供一些建议. Util分层架构介绍 ...
- .Net Core应用框架Util介绍(五)
上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Ma ...
- Magicodes.Admin.Core开源框架总体介绍
框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- .Net Core应用框架Util介绍(四)
上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机. Angular应用由Ts和Html两部分构成,本文介绍第一部分. Angu ...
- .Net Core应用框架Util介绍(三)
上篇介绍了Util的开发环境,并让你把Demo运行起来.本文将介绍该Demo的前端Angular运行机制以及目录结构. 目录结构 在VS上打开Util Demo,会看见如下的目录结构. 现代前端通常采 ...
- .Net Core应用框架Util介绍(一)
距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆. 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经 ...
随机推荐
- 设计模式C++描述----22.访问者(Visitor)模式
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...
- virtual与override的使用
在函数的声明中,当有“virtual”修饰的时候,和没有virtual有什么区别呢?最重要的一点就是调用实例的函数是在编译的时候确定还是在运行的时候确定,virtual函数是在运行的时候来确定具体调用 ...
- HTML5+CSS:02用户注册表单
新的学期已开始接近两个月了,还记得是在国庆节那几天申请的博客账号,可过了一个月都还没开始写博客,(>_<)有点小偷懒了,不过,学习还是不能落下的,今写一个有点实践运用的关于 ...
- (转载)学校搭建使用nginx同时编译rtmp-module进行直播的技术文档
原文地址:学校搭建使用 nginx 同时编译 rtmp-module 进行直播的技术文档 转载自我的大佬同学 MetalkgLZH.学校有几次需要全校观看网络直播的情况,但是学校的带宽不允许所有的班一 ...
- 品优购(IDEA版)-第二天
品优购-第2天 学习目标 目标1:运用AngularJS前端框架的常用指令 目标2:完成品牌管理的列表功能 目标3:完成品牌管理的分页列表功能 目标4:完成品牌管理的增加功能 目标5:完成品牌管理的修 ...
- python中字符串常见操作(二)
# 可迭代对象有:字典,列表,元组,字符串,集合 str1 = '192.168.1.1' str2 = 'as df gh jk' str3 = '小李子' str4 = ['aa','bb','c ...
- SqlServer2005 查询 第五讲 top
今天我们来说sql命令中得参数top top top[ 最前面若干个记录,专属于SqlServer2005的语法,不可移植到其他库.oracle中是用rownum<6来实现输出前5行记录.] 下 ...
- python 做一个简单的登录接口
# -*- conding :utf-8 -*-# File Name: homewoe# Create Date: 2019/11/20 / 9:15# Change Activity: 2019/ ...
- iOS界面流畅技巧之微博 Demo 性能优化技巧
微博 Demo 性能优化技巧 我为了演示 YYKit 的功能,实现了微博和 Twitter 的 Demo,并为它们做了不少性能优化,下面就是优化时用到的一些技巧. 预排版 当获取到 API JSON ...
- ansible-template
template简介 template功能: 根据模板文件动态生成对应的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 ansible的template模板使 ...