Delia's Blog

菜鳥工程師小鈞的筆記

0%

關於我

C#後端工程師,畢業於屏東大學資訊管理系,2021年9月開始工程師之路,目前年資兩年,對於程式架構方面有很大的興趣,業餘時間會去各大社群看資深前輩們技術分享教學。

參與過電商系統翻新,負責核心訂單、購物車API開發,擅長電商金流、貨態、庫存變化…等領域知識,也參與過ERP系統流程規劃、微服務架構規劃、ERP後端API開發。


技能清單

  • 後端語言 & 框架
    C# ASP.NET Core ASP.NET Framwork WinFrom
  • SQL
    SQLServer MongoDB
  • ORM
    Entity Framwork Dapper ADO.NET
  • 前端
    HTML5 CSS3 jQuery Bootstrap Vue.js
  • 版本控制
    SVN Git
  • CI/CD
    Jenkins Bitbucket Pipeline

學習、工作經歷

⊚ 資策會C#工程師就業養成班 (2021/1 ~ 2021/8)

  1. 擔任專題技術長,負責小組畢業專題規劃,食譜&購物電商
  2. 專題導入三層式架構,IOC控制反轉,唯一有分層的組別

⊚ 聯邦網通(2021/9 ~ 2022/9)

  1. 電商系統翻新 : 維持原本Database、後臺系統,將邏輯層改寫為API前後分離,了解電商領域知識。

  2. 訂單、購物車API : 處理折扣邏輯購物車驗證購物車分車邏輯訂單狀態庫存控制

  3. 金流串接 : 聯邦串接Line Pay金串接

  4. 物流串接 : 黑貓

  5. 小工具API : banner、館別資訊…使用快取增加讀取速度

  6. 聯邦年節團購網站佈署維護 : webform專案重新佈署。

  7. 聯邦紅利兌換網站佈署維護 : webform專案重新佈署。

⊚ 無毒農(2022/9 ~ NOW)

🚩2022週年慶後端API - 搶購功能


🚩微服務架構重整、導入單元測試

1. UnitOfWork導入

將每個Repossitory內的SaveChange抽離出來,外面包一層Unit Of Work,減少建構子注入劃分服務領域Transation語法更直觀

修改前

public class CreateOrderCommandHandler : IRequestHandler<CreateOrderCommandHandler, CreateOrderCommandDto>
{
private readonly IOrderRepository _orderRepository;
private readonly IOrderDetailRepository _orderDetailRepository;
private readonly IMemberRepository _memberRepository;
private readonly IStockRepository _stockRepository;
//...注入爆炸

public CreateOrderCommandHandler(IOrderRepository orderRepository, IOrderDetailRepository orderDetailRepository, IMemberRepository memberRepository, IStockRepository stockRepository)
{
_orderRepository = orderRepository;
_orderDetailRepository = orderDetailRepository;
_memberRepository = memberRepository;
_stockRepository = stockRepository;
}

public async Task<CreateOrderCommandDto> Handle(CreateOrderCommand command)
{
//...
_orderRepository.SaveChange();//???
}
}

修改後

public class CreateOrderCommandHandler : IRequestHandler<CreateOrderCommandHandler, CreateOrderCommandDto>
{
private readonly IOrderUnitOfWork _orderUnitOfWork;
private readonly IStockService _stockService;

public CreateOrderCommandHandler(IOrderUnitOfWork orderUnitOfWork, IStockService stockService)
{
_orderUnitOfWork = orderUnitOfWork;
_stockService = stockService;
}

public async Task<CreateOrderCommandDto> Handle(CreateOrderCommand command)
{
using var tran = await _unitOfWork.UnitOfWorkBase.BeginTransactionAsync();//開啟交易
Member member = _orderUnitOfWork.member.GetAsQueryAble().Where()...
CreateOrderBO bo = new(member);//邏輯物件
StockService.DeductingStock()//更新庫存
tran.commit();
}
}

2. MediatR導入

將Controller、Service解偶,Api對應的UseCase獨立單獨Handler處理, 大幅增加專案可讀性可維護性,同事都說讚。

修改前

修改後

private readonly Isender _sender;

public class PersonController(ISender sender)
{
_sender = sender;
}

[HttpGet]
public async Task<IActionResult> GetPersonPage(GetPersonPageQuery)
{
return await _sender.send(GetPersonPageQuery)
}

[HttpGet]
public async Task<IActionResult> GetPersonById(GetPersonQuery)
{
return await _sender.send(GetPersonQuery)
}

[HttpPost]
public async Task<IActionResult> CreatePerson(CreatePersonCommand)
{
return await _sender.send(CreatePersonCommand)
}

3. FluentValidation導入

統一參數驗證方法,搭配MediatR Pipeline統一處理Exception,並且更好做單元測試

4. UnitTest導入

使用NUnit with FluentAssertions & AutoFixture & NSubstitute。

5. 架構圖


🚩.NET Core 訊息微服務建置

使用.NET CAP套件,用KAFKA作為Event bus傳遞事件。
本站文章連結

整體架構

寄送簡訊設計模式

var setting = _SmsSetting.Filter(_ => _.Enable).OrderBy(_ => _.Sort).ToList();

foreach(var item in settings)
{
var smsProvider = _smsFactory.GetSmsProvider(item.SmsProvierType);
//紀錄log...
var smsReponseDto = smsProvier.Send(smsRequestDto);
//紀錄log...
if (smsResponseDto.IsSuccess) break;
}

後臺管理

🚩排程專案建置

使用.net core console app搭配Airflow,執行指令輸入類似api框架的router,即可執行指定排程,執行時間由DAG設定corn表達式設定。

範例指令

dotnet run Member VipUpgrade

專案架構

[JobClass("Member")]
public class MemberJob
{
private readonly ISender _sender

public MemberJob(ISender sender)
{
_sender = sender;
}

[JobMethod("VipUpgrade")]
public async Task VipUpgrade()
{
_sender.send(new VipUpgradeCommand());
}
}

🚩商品評論效能優化


近期學習目標

  • 持續練習OOP、設計模式
  • Redis cache深入研究 (Cache Avalanche、Hotspot Invalid、持久化)
  • Github專案管理
  • Queue深入研究(kafka、rabbitMQ)
  • 研究 DDD、Clean Architecture