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介绍(二)相关推荐

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

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

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

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

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

    上篇.Net Core应用框架Util介绍(二)介绍了Util的开发环境,并让你把Demo运行起来.本文将介绍该Demo的前端Angular运行机制以及目录结构. 目录结构 在VS上打开Util De ...

  4. (非常重要).Net Core应用框架Util介绍(学习Util)

    转载地址https://blog.csdn.net/sD7O95O/article/details/82598545(看看!) 不过Util作者本人的博客地址在https://www.cnblogs. ...

  5. C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(二)

    轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍 下面,再举一个稍微复杂的例子,它的覆盖面是足够全面的,足以一瞥面向对象编程的3个要素:数据抽象.继承和多态.通过这个例子,我们期望展现出LW_ ...

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

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

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

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

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

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

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

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

最新文章

  1. 一口气发布1008种机器翻译模型,GitHub最火NLP项目大更新
  2. 微服务限流Sentinel讲解(二)
  3. 【转】QT 串口QSerialPort + 解决接收数据不完整问题
  4. hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
  5. Vue.js 组件基础
  6. DCMTK:表示细分对象的类
  7. 计算机系在职研究生 网络班,在职研究生都有网络班吗?
  8. Reversing-x64Elf-100
  9. 2k 幻14_幻14、2020雷蛇潜行版、mbp、gs66等笔记本之间的选择??
  10. 苹果发布 Safari 技术预览版 131,其中包含错误修复和性能改进
  11. 【验证码识别】基于matlab CNN卷积神经网络验证码识别【含Matlab源码 098期】
  12. 《统计学》第八版贾俊平第十四章指数知识点总结及课后习题答案
  13. h3c comware 使用 freeradius 统一认证---草稿
  14. Linux驱动开发(十三)---USB驱动HID开发学习(鼠标)
  15. Review and start again——First Period JAVA web Program hotelmanagement:6.some about JAVA factory mode
  16. 惠普找不到远程服务器,找不到网络打印机是怎么回事?
  17. 邮件安全防护之反垃圾邮件开源软件ASSP
  18. 巧用Mac上的Spotlight搜索
  19. 【为人处事】:如何识人
  20. matlab模拟线圈电磁场,利用MATLAB的PDE工具箱对电场和磁场进行模拟

热门文章

  1. javasript 面向对象
  2. linux基础命令rpm,rpm常用命令集合1
  3. GraphAPI 1.0中新增加的Teams API
  4. 在Windows 7或Vista资源管理器中禁用缩略图预览
  5. 如何更改您的iPhone铃声
  6. Fish Shell 使用笔记
  7. 矿难让显卡压了那么多货咋办?NV如是说
  8. commons-lang3:DateUtils
  9. 电脑内部录音教程Virtual Audio Cable使用教程
  10. [MySQL]关于amd.dll后门病毒入侵3306端口的临时解决方案