專案到處散落 db.Customers.InsertOnSubmit(c); db.SubmitChanges();。若未來 Customers 拆表、重命名、或遷移至其他 ORM,修改成本極高且易漏改。
public partial class MyDataContext : DataContext
{
// 建構子略...
// 封裝 Insert
public void InsertCustomer(Customer customer)
{
this.GetTable<Customer>().InsertOnSubmit(customer);
this.SubmitChanges();
}
// 封裝 Update (實體已附加或透過 Attach)
public void UpdateCustomer(Customer customer)
{
// 視追蹤狀態決定 Attach/Refresh 邏輯
this.SubmitChanges();
}
// 封裝 Delete
public void DeleteCustomer(Customer customer)
{
this.GetTable<Customer>().DeleteOnSubmit(customer);
this.SubmitChanges();
}
}
// 原始碼散落處
db.Customers.InsertOnSubmit(c); db.SubmitChanges();
// 改為
db.InsertCustomer(c); // 單一入口,內部可擴展驗證、日誌、事務等
public class Repository<TEntity> where TEntity : class
{
protected readonly DataContext _context;
protected readonly Table<TEntity> _table;
public Repository(DataContext context) {
_context = context;
_table = context.GetTable<TEntity>();
}
public virtual void Insert(TEntity entity) {
_table.InsertOnSubmit(entity);
_context.SubmitChanges();
}
public virtual void Delete(TEntity entity) {
_table.DeleteOnSubmit(entity);
_context.SubmitChanges();
}
public virtual void Save() => _context.SubmitChanges();
}
// 使用
var customerRepo = new Repository<Customer>(db);
customerRepo.Insert(new Customer { ... });
將 InsertOnSubmit/DeleteOnSubmit/SubmitChanges 封裝於 DataContext 分部類 或 Repository 中,實現「資料操作入口單一化」,隔離資料結構變更對業務代碼的衝擊,符合依賴倒置與單一職責原則。