.Net Core AA.FrameWork應用框架介紹
阿新 • • 發佈:2019-10-16
開發多年,一直在從社群獲取開源的便利,也深感社群力量的重要性,今天開源一個應用基礎框架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(1); user.GmtModified = DateTime.Now; var result = userInfoRepository.Update(user);
獲取實體
var user = userInfoRepository.Get(1);//By 主鍵 var users = userInfoRepository.GetAll();//所有 var users = userInfoRepository.Select(p => p.UserName == "chengTian");//謂詞
刪除實體
var user = userInfoRepository.Get(1); 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 用法
- log4net.config 配置,並將log4net.config的屬性->複製到輸出目錄->設定為->始終複製
- Log4NetLogger.Use("配置檔名或者路徑+配置檔名"); 例如:log4net.config檔案在根目錄下,Log4NetLogger.Use("log4net.config");如果在自定義檔案中;例如config/log4net.config 則Log4NetLogger.Use("config/log4net.config")
- 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 = 10 })); //事件 TaskUtil.Await(busControl.Publish<OrderSubmitted>(new { Id = 1 }));
消費者
[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 0; } } 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 = 1, Name = "成天" ,Remark="微信公眾號:dotNet知音"}; var userDto = userVm.MapTo<UserInput>(); //var userDto2 = userVm.MapTo<UserVm,UserInput>(); }
後面也會提供基於AA框架的應用例項,有問題可以聯絡我,一起交流和成長。