0%

[DotnetCore]泛型運用系列-Model設計篇

前情提要

筆者日前工作環境中要實作,從某個FTP位置下載檔案,下載到檔案後將檔案內容轉成物件清單,存進資料庫中,接著這些檔案依照屬性不同,拆成四分檔案,有共同欄位,也有各自的欄位,資料表則依照最大化原則,將所有檔案欄位最大化後設計成對應的欄位,當然設計一個識別欄位:EventType,識別是哪個檔案的資料。最後這個檔案內容轉換成資料表中的資料,要掛在排程上面做運作,筆者簡單列一下此一系列的實作需要用到的概念與套件如下:

  • AutoMapper:運用於將檔案內容對應的物件轉成EFCore的物件時
  • Generic Class/Method: 不想寫多個Service去處理多個檔案,設計成泛型形式以符合各種檔案類型
  • Attribute: 透過Description Attribute,註記其對應的Comlumn欄位順序
  • Coravel:透過該套件,將寫好的Service掛成排程任務
  • Extension Method:有一些通用的Method,不要落落等塞在一個Service中,因此轉換成可以共用的Extension Method
  • EFCore:資料存取用開發套件

內容

此篇主要介紹若要設計成Generic Class/Method的形式,增加其擴充彈性,第一步就是要宣告Model,筆者這邊將該四個檔案共同欄位,設計成一個Base Class

1
2
3
4
5
6
7
8
9
10
public abstract class BaseModel
{
[Description("2")]
public string TransactionDate { get; set; }
public abstract string EventCode { get; set; }
[Description("1")]
public string BranchCode { get; set; }
public string AuditUser { get; set; } = "SYS";
public DateTime AuditTime { get; set; } = DateTime.Now;
}

以上設計來說,有以下的好處

  • 設定預設值,不用個別寫在四個不同Class中
  • 接著同樣的欄位部分,也不用重複宣告,也省掉宣告Attribute屬性
  • 將共同欄位中需要各別設定的欄位部份,將其設計成abstract的形式,讓各自子Class一定要宣告

除了上述說的好處之外,泛型的Method在撰寫時需要存取到共有的欄位時,皆會設計一個Base ClassInterface,接著宣告泛型類別的Constriant宣告時指定為該Base ClassInterface,因此你可以在Generic Method中可以存取得到共有的欄位,然後做一些進階的邏輯處理,範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
using System;

public class DomainGenericClass<T>
where T : BaseModel
{
public void DoProcess()
{
var model = Activator.CreateInstance<T>();
model.AuditUser = "SYS";
model.AuditTime = DateTime.Now;
// Other Logic
}
}

結論

筆者因在工作環境中常撰寫底層元件,因此很常使用泛型來開發讓各個專案使用的方法,這篇內容就是筆者常用的招數之一。接著用幾篇來說明這次實作的下載檔案並將檔案內容存至資料庫應用,下篇見了。

參考