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介绍(二)的更多相关文章

  1. .Net Core应用框架Util介绍(二)

    Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...

  2. .Net Core应用框架Util介绍(二) 转

    Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...

  3. .Net Core应用框架Util介绍(六)

    前面介绍了Util是如何封装以降低Angular应用的开发成本. 现在把关注点移到服务端,本文将介绍分层架构各构造块及基类,并对不同层次的开发人员应如何进行业务开发提供一些建议. Util分层架构介绍 ...

  4. .Net Core应用框架Util介绍(五)

    上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Ma ...

  5. Magicodes.Admin.Core开源框架总体介绍

    框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...

  6. 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  7. .Net Core应用框架Util介绍(四)

    上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机. Angular应用由Ts和Html两部分构成,本文介绍第一部分. Angu ...

  8. .Net Core应用框架Util介绍(三)

    上篇介绍了Util的开发环境,并让你把Demo运行起来.本文将介绍该Demo的前端Angular运行机制以及目录结构. 目录结构 在VS上打开Util Demo,会看见如下的目录结构. 现代前端通常采 ...

  9. .Net Core应用框架Util介绍(一)

    距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆. 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经 ...

随机推荐

  1. Chrome插件开发(四)

    在前面我们编写了三个比较实用的插件,在实际工作中,我们还会使用很多其他的插件,比如掘金,Pocket之类的,我们可能需要经常启用或禁用插件或者删除插件,如果每次都要点到更多工具->扩展程序中去做 ...

  2. InfluxDB常见疑问与解答 - 数据写入时如何在表级别指定保留策略

    网友Siguoei:我想让一个库中不同的measurment能够指定不同的保存策略.而不是写入时使用数据库的默认保留策略. Answer:这个特性InfluxDB支持的,写入时序数据时,在行协议前加上 ...

  3. 前端技术之:使用webpack构建React程序配置方法

    package.json中需要引入以下依赖:   开发依赖: "@babel/core": "^7.1.2", "@babel/preset-env& ...

  4. JavaScript如何友好的操作的cookie

    1.前言 众所周知,在JS中处理cookie有些复杂,因为其操作cookie的接口相当不友好,即BOM的document.cookie属性.这个属性的独特之处在于它会因为使用它的方式不同而表现出不同的 ...

  5. eclipse断点的使用---for循环举例

    在很多时候,我们在学习过程中,不知道代码具体的实现过程,很好奇这个变量的值怎么就发生的变化,用好断点的使用,帮助我们更好的理解. 例子:10以内的奇数之和 package day03; public ...

  6. PTA刷题记录(3)

    团队天梯赛-------(3)分值:15 给定一个 k 位整数 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​ ...

  7. vue 单页面应用 app自适应方案

    本文是使用淘宝的方案进行布局开发的,遇到的问题是会对app内使用的第三方插件,当页面进行缩放后,比如高德地图中的文字会显得过小,我使用的方法就是手动的动每一个尺寸进行手动的px 到 rem的替换,而不 ...

  8. Project Euler 59: XOR decryption

    计算机上的每个字母都对应一个独特的编号,普遍接受的标准是ASCII(美国信息交换标准代码).例如,大写字母的A的ASCII码是65,星号(*)的ASCII码是42,而小写字母k的代码是107. 一种现 ...

  9. 【持续更新】【pat】pat刷题技巧记录

    修改code completion快捷键位CTRL+ENTER,帮助提示函数名称 修改命令行提示符的属性,开启快速编辑模式,方便调试 添加c++11语言标准支持 开启代码调试功能 对输入的字符串进行切 ...

  10. 腾讯Techo开发者大会PPT分享

    腾讯云年度的开发者大会已经落幕,大会包括1场前沿技术主峰会,18个技术专场,150位海内外技术专家,28个互动展区,8场动手实验室,23小时小程序云开发极限编程,1场数据库诊断大赛. 内容上涵盖了最新 ...