.Net Core AA.FrameWork應用框架介紹


 開發多年,一直在從社區獲取開源的便利,也深感社區力量的重要性,今天開源一個應用基礎框架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 用法

  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 = 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框架的應用實例,有問題可以聯系我,一起交流和成長。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM