开发多年,一直在从社区获取开源的便利,也深感社区力量的重要性,今天开源一个应用基础框架AA.FrameWork,也算是回馈社区,做出一点点贡献,希望能够帮助类似当年入行的我。

AA.FrameWork 是基于.NET core流行的开源类库创建的基础应用框架。

框架代码图如:

源代码github地址:https://github.com/ChengLab/AAFrameWork

nuget管理中,搜索前缀名称 AA 即可如图

Nuget Packages

Package nuget description
AA.Dapper nuget 基于dapper,Dapper-FluentMap 开发 , 支持工作单元、仓储模式和原生dapper的操作
AA.Log4Net nuget 基于Log4net开发,提供常用的日志操作类
AA.FrameWork nuget 基础框架
AA.Redis nuget 基于StackExchange.Redis开发,提供各种redis操作和基于redis的分布式锁
AA.AutoMapper nuget 基于AutoMapper开发,对象映射
AA.ServiceBus nuget 基于MassTransit开发的服务总线 ;很方便的应用在event bus 和 publish/subscribe 场景
AA.AspNetCore nuget aspnetcore常用类集合

AA.Dapper用法

实体映射配置

使用DommelEntityMap<TEntity>类映射属性名称。创建一个派生类,在构造函数中设置Map方法,可指定某个属性映射到数据库列名

   public class UserInfoMap : DommelEntityMap<UserInfo>
{
public UserInfoMap()
{
ToTable("Sys_UserInfo");//映射具体的表名
Map(p => p.SysNo).IsKey();//指定主键 ,IsIdentity是否自增
Map(p=>p.GmtCreate).ToColumn("GmtCreateDate"); //属性名和数据库列名 可以不同
Map(p=>p.LastLoginDate).Ignore();//一些计算属性,可以忽略不需要跟数据库列进行映射
}
}

使用MapConfiguration.Init方法,把映射类初始化,后续就可以使用了

public static void InitMapCfgs()
{
var fluentMapconfig = new List<Action<FluentMapConfiguration>>();
fluentMapconfig.Add(cfg =>
{
cfg.AddMap(new UserInfoMap());
});
MapConfiguration.Init(fluentMapconfig);
}

开始使用AA.Dapper

使用DapperContext设置数据库连接和数据库类型是sqlserver还是mysql
 public class AADapperContext : DapperContext
{
public AADapperContext() : base(new NameValueCollection()
{
["aa.dataSource.AaCenter.connectionString"] = "Data Source =.; Initial Catalog = AaCenter;User ID = sa; Password = 123;",
["aa.dataSource.AaCenter.provider"] = "SqlServer"
})
{ }
}
仓储包含了大部分的操作,同时支持Async操作
IDapperRepository<UserInfo> userInfoRepository = new DapperRepository<UserInfo>();
插入实体
 var user = new UserInfo()
{
UserName = "chengTian",
RealName = "成天",
GmtCreate = DateTime.Now,
GmtModified = DateTime.Now
};
var result = userInfoRepository.Insert(user);
修改实体
 var user = userInfoRepository.Get();
user.GmtModified = DateTime.Now;
var result = userInfoRepository.Update(user);
获取实体
var user = userInfoRepository.Get();//By 主键
var users = userInfoRepository.GetAll();//所有
var users = userInfoRepository.Select(p => p.UserName == "chengTian");//谓词
删除实体
  var user = userInfoRepository.Get();
var result = userInfoRepository.Delete(user);
支持Dapper原生操作

操作基本的封装都是单表的操作,可以满足一部分业务开发,有些业务场景编写sql还是比较合适的比如报表和一些复杂的查询,推荐使用原生dapper的操作

public class UserInfoRepository : DapperRepository<UserInfo>, IUserInfoRepository
{
private readonly IDapperContext _dapperContext;
public UserInfoRepository(IDapperContext context)
{
_dapperContext = context;
} public IEnumerable<UserInfo> QueryAll()
{
var result = _dapperContext.DataBase.Query<UserInfo>("SELECT * from [Sys_UserInfo]");//实例
return result;
}
}

AA.Log4Net 用法

  1. log4net.config 配置,并将log4net.config的属性->复制到输出目录->设置为->始终复制
  2. Log4NetLogger.Use("配置文件名或者路径+配置文件名"); 例如:log4net.config文件在根目录下,Log4NetLogger.Use("log4net.config");如果在自定义文件中;例如config/log4net.config 则Log4NetLogger.Use("config/log4net.config")
  3. ILog log= Logger.Get(typeof(类)); log.Debug("example");

AA.ServiceBus 用法

生产者(事件和命令两种类型)

实例化bus

 //事件
IBusControl busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.BuildEventProducer();
//命令
ISendEndpoint busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.BuildCommandProducer(queueName);

实例化bus之后可以使用发送和发布两个方法

  //命令
TaskUtil.Await(busControl.Send<SubmitOrder>(new
{
Id =
}));
//事件
TaskUtil.Await(busControl.Publish<OrderSubmitted>(new
{
Id =
}));
消费者
[Fact]
public void TestConsumer()
{
Log4NetLogger.Use("Log4Net/log4net.config");
string rabbitMqUri = "rabbitmq://localhost:5672";
string rabbitMqUserName = "";
string rabbitMqPassword = "";
string queueName = "order.queue"; var busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.RegisterConsumer<SubmitOrderCommandConsumer>(queueName)//注册命令消费者
.RegisterConsumer<OrderSubmittedEventConsumer>(null)//注册事件消费者
.Build();
busControl.Start(); }

定义消费者需要实现接口IConsumer

public class OrderSubmittedEventConsumer : IConsumer<OrderSubmitted>
{
public async Task Consume(ConsumeContext<OrderSubmitted> context)
{
var @event = context.Message; var result = $"OrderSubmittedEvent {@event.Id.ToString()}";
ILog log = Logger.Get(typeof(OrderSubmittedEventConsumer));
log.Debug(result);
//do somethings...
}
} public class SubmitOrderCommandConsumer : IConsumer<SubmitOrder>
{
public async Task Consume(ConsumeContext<SubmitOrder> context)
{
var command = context.Message; var result = $"CreateFooCommand {command.Id.ToString()}";
ILog log = Logger.Get(typeof(SubmitOrderCommandConsumer));
log.Debug(result);
//do somethings...
}
}

AA.AutoMapper用法

实现IMapperConfiguration接口,创建映射规则配置
public class WebMapperConfigurations : IMapperConfiguration
{
public int Order { get { return ; } } public Action<IMapperConfigurationExpression> GetConfiguration()
{
Action<IMapperConfigurationExpression> action = cfg =>
{
cfg.CreateMap<UserVm, UserInput>();
};
return action;
}
}
在程序startup调用配置
 var mapperConfig = new WebMapperConfigurations();
AutoMapperConfiguration.Init(new List<Action<IMapperConfigurationExpression>> { mapperConfig.GetConfiguration() });
ObjectMapping.ObjectMapManager.ObjectMapper = new AutoMapperObjectMapper();
利用扩展方法MapTo执行映射
 [Fact]
public void TestMap()
{
//init
Init();
UserVm userVm = new UserVm { Id = , Name = "成天" ,Remark="微信公众号:dotNet知音"};
var userDto = userVm.MapTo<UserInput>();
//var userDto2 = userVm.MapTo<UserVm,UserInput>(); }

后面也会提供基于AA框架的应用实例,有问题可以联系我,一起交流和成长。

最新文章

  1. nginx 添加nginx-http-concat模块
  2. centos 防火墙
  3. ArrayList 和 LinkedList 的区别
  4. Delphi 记录类型- 结构指针
  5. Xcode 6 模拟器路径
  6. jquery中 cache: true和false的区别
  7. Unity3D之Ugui 制作弹框
  8. poj2239 Selecting Courses --- 二分图最大匹配
  9. linux之SQL语句简明教程---Alias
  10. duplicate symbol _*** in:
  11. Python 学习笔记9
  12. CGAffineTransform 放射变换解析 即矩阵变换
  13. H5移动端开发入门知识以及CSS的单位汇总与用法
  14. tensorflow 从入门到上天教程一
  15. Angular4.0用命令行创建组件服务出错
  16. svg从入门到装逼(一)
  17. Linux 查看负载内存
  18. 框架的一些bug问题记录
  19. RabbitMQ跟Redis做消息队列的区别
  20. 网页真机调试之Browsersync简介

热门文章

  1. Wamp 新增php版本 教程
  2. 【Offer】[24] 【反转链表】
  3. 【Offer】[16] 【数值的整数次方】
  4. 基于soot的java方法名生成报告
  5. .netcore 使用阿里云短信
  6. Python网络爬虫实战(三)照片定位与B站弹幕
  7. 每个Java开发人员都应该知道的10个基本工具
  8. ASP.NET Core 2.2 : 二十二. 多样性的配置方式
  9. 弄懂Java为何只有值传递
  10. Vue学习之不同组件之间的消息传递