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. Django的下载与基本命令

    1.下载Django: pip3 install django==2.1.2 2.创建一个django project django-admin startproject 项目名称 3.在项目目录下创 ...

  2. IL2CPP深入详解-总览

    导语 该系列将会分为以下几个部分:1. 总览(本文)2. c++代码解析3. 调试c++代码4. 方法调用(一般方法,虚方法等)5. 泛型共享6. 类型与方法的 P/invoke 封装7. 垃圾回收8 ...

  3. else 的特殊用法和三目运算

    1,eval() 获取原始数据类型 例1: str = " a = eval(str) print(a,type(a)) a得到的结果是整型10,不是字符串10 例2: str1 = &qu ...

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

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

  5. Kong05-Kong 的健康检查和监控

    您可以让 Kong 代理的 API 使用 ring-balancer , 通过添加包含一个或多个目标实体的upstream 实体来配置,每个目标指向不同的IP地址(或主机名)和端口.ring-bala ...

  6. 基于node的前端组件包发布至nexus和npmjs

    目录 目录... 3 1. 前言... 1 2. 配置... 1 2.1. 建立组件的导出模块... 1 2.2. 建立组件入口文件... 1 2.3. 配置“ng-package.json”文件.. ...

  7. 蓝牙耳机没声音,用mac平台下的safari时

    买了个蓝牙耳机,发现用其他本地播放器或者chrome的时候有声音, 但是用safari的时候没有声音,最后发现是flash的问题. 只要清除浏览数据后刷新就有声音了

  8. restapi(9)- caching, akka-http 缓存

    restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性.使用缓存是一项有效工具.我们可以把多数前端请求的回复response存入缓存,特别是一些需要大量计算才能获取的回复值,更 ...

  9. nmap学习笔记-扫描格式

    习惯性的前言: 之前曾经零零星星的学习过一段时间的nmap,但是因为用的少,后续有慢慢的放下了,这次正好借着工作上的机会重新学习一下nmap,并记录在此. nmap端口状态: open:应用程序在该端 ...

  10. HTTPS加密流程理解

    HTTPS加密流程 由于HTTP的内容在网络上实际是明文传输,并且也没有身份验证之类的安全措施,所以容易遭到挟持与攻击 HTTPS是通过SSL(安全套接层)和TLS(安全传输协议)的组合使用,加密TC ...