發表文章

DDD Query多型 Controller 寫法

 [JsonPolymorphic(TypeDiscriminatorPropertyName = "prdtype")] [JsonDerivedType(typeof(CarCreateRequest), "01")] [JsonDerivedType(typeof(MotoCreateRequest), "02")] [JsonDerivedType(typeof(CosmeticCreateRequest), "03")] public abstract class ProductCreateRequest {     public string ProductName { get; set; } } 沒有上述那套系統寫法的話(.net core 7以前) 接Json去拆資料 [HttpPost] public IActionResult Create([FromBody] JObject data) {     string type = data["PrdType"]?.ToString();     ProductCreateRequest rq = type switch     {         "01" => data.ToObject<CarCreateRequest>(),         "02" => data.ToObject<MotoCreateRequest>(),         _ => throw new Exception("Unsupported product type")     };     _service.Create(rq);     return Ok(); } 然後由於這個東西是算是要組Domain Model的值 因此也可以再DDD裡面做 把Request model放到DDD內就好 或者避免耦合性問題 (可能會有多個Json要拆解) 也可以建立一個Factory 專門拆解完後丟出Request 讓...

DB連線 時代的眼淚

          protected SqlConnection GetConnection()         {             return new SqlConnection(_WebSiteConnectionString);         }         //避免因DB修改後對不上欄位錯誤         protected bool HasColumn(SqlDataReader reader, string columnName)         {             for (int i = 0; i < reader.FieldCount; i++)             {                 if (reader.GetName(i).Equals(columnName, StringComparison.OrdinalIgnoreCase))                     return true;             }             return false;         }         protected List<T> ExecSqlReader<T>(string sqlString) where T : new()    ...

DDD With MVC

DDD With MVC 在我看來最大的差別在於 一個把主要商業邏輯在Domain Model 完成 一個主要是把商業邏輯在Service 完成 在Domain Model 完成的東西主要是跟Model有很強的耦合性 而商業邏輯全都放在 Service 的 MVC 會造成任何更改的商業邏輯都需要寫入Service中 會很臃腫 來源:ChatGpt

Docker整理

FOR python  FROM  python:3.8-slim-buster #版本 可從DOCKER DESKTOP上找到 WORKDIR /app #切換位置 若無此資料夾 會自動建立 COPY . . #第一個參數代表本地 第二個參數代表容器上 RUN pip3 install -r requirement.txt #運行shell 命令  CMD["python3" , "app.py"] #運行CMD 執行 python FOR C# .NET Core 8.0 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build #版本 可從DOCKER DESKTOP上找到 WORKDIR /src #切換位置 若無此資料夾 會自動建立 COPY . . #複製所有程式碼 RUN dotnet restore *.csproj #找尋目標csproj # 建置 Release ARG BUILD_CONFIGURATION=Release #建立變數 RUN dotnet build -c $BUILD_CONFIGURATION -o /app/build #可以建立出bin 等資訊檔 可用來弱掃等 #後面不指定csproj 就自動去抓專案裡的 csproj 建議自己去指定 如RUN dotnet restore *.csproj 一樣 RUN dotnet test #跑測試 RUN dotnet publish -c $BUILD_CONFIGURATION-o /app/publish #Release出來 # ----------------------------------------- # 2. Runtime Stage # ----------------------------------------- FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final #可從  Microsoft Container Registry (MCR) 中找 WORKDIR /app # 從 build 階段複製編譯好的成果 COPY --from=build /app/publish . #來自 build階段的/app/pu...

整理工具及未來使用規劃

KeyClock Kong Docker K8S .NetCore > DI > DAPPER > SWAGGER > Environment Vue3  Kafka JWT APIM AWS S3 DDD架構

Vue Pinia

圖片
 掛載了pinia之後 main.js內會自動載入 pinia 和 app.use(createPinia); 接著會有一個資料夾叫stores 內有 counter.js 每一個defineStore內 都會有一個id 必須要有 import { useCounterStore } from "pinia路徑" const store = useCounterStore(); const clickAdd = () => {     store.increment(); } 這樣啟用這個function 則 store.counter會增加數值 接著可以把上述的寫法轉換成 以上的寫法 用這個寫法的話 import {storeToRefs} from "pinia" const store = useCounterStore();  const {addCount} = store; const {counter } = storeToRefs(store); 就可以直接用 {{ counter }} 而不是使用 {{store.counter}} watch(value , (newval , oldval) => {     //todo 這樣可以監控新舊的val }); //新的方法有 $subscribe(mutation , state) => {     //todo } 兩個方法是一樣的 參考 : Vue3 + Vite 快速上手 Get Startrd EP6

Vue composable 共用組件 v-if用法 及 axios

     composable 共用組件,官方建議 依照use開頭 比如 今天要做一個監聽滑鼠位置的程式 const pageX = ref(0); const pageY = ref(0); const mouseposition = (e) => {      pageX  = e.pageX;      pageY  = e.pageY; } onMounted(() => { //這代表生命週期 他只會在程式載入時第一次執行     windows.addEventListener(" mousemove " , mouseposition ); //註冊一個mousemove的事件 回傳值丟到mouseposition中 } ) onUnmounted(() => { //這也是代表生命週期 這會在關閉畫面的時候執行 類似C#的資源回收     windows.removeEventListener("mousemove " , mouseposition ); } ) 然後把這些東西丟進composiable內 並且使用 export function functionname(){          return {           PageX ,           PageY}; } 包住 並且引入的方法就是 import { functionName } from "./yoursite/yourFunctionName" 這跟之前不一樣 要括號 然後引用方法 const {PageX , PageY} = functionName  實作一個function import {ref , readonly } from "vue" export function useAddData(val){     const data = ref(val...