[英]How to refactor this code so I can make changes more easily
我的項目中有大約 40 個數據集 forms,分為 8 個數據集組。我會盡量簡單地解釋。 以IDCards
組為例。 我有 2 個數據集, ValidIDCards
和ValidIDCardsForeigners
。 目前,對於每個數據集,我的后端文件夾結構如下所示(我將使用ValidIDCards
作為示例):
ValidIdCards
-Commands
-Create
- CreateValidIDCardsCommandModel
- CreateValidIDCardsCommandHandler
- CreateValidIDCardsCommandValidator
-Update
- CreateValidIDCardsCommandModel
- CreateValidIDCardsCommandHandler
- CreateValidIDCardsCommandValidator
-Other commands..
-Queries
-GetAll
- GetAllValidIDCardsQueryModel
- GetAllValidIDCardsQueryHandler
- GetAllValidIDCardsQueryViewModel
-GetbyId
- GetByIdValidIDCardsQueryModel
- GetByIdValidIDCardsQueryHandler
- GetByValidIDCardsQueryViewModel
-Other queries..
現在,看看Create
命令。 CreateValidIDCardsCommandModel
看起來像:
public class CreateValidIDCardsCommandModel : IRequest<int>
{
public int Id { get; set; }
public string Institution { get; set; }
public int Total { get; set; }
public int CountryID{ get; set;} //foreign key to another table
}
CreateValidIDCardsCommandHandler
看起來像:
public async Task<int> Handle(CreateValidIDCardsCommandModel request, CancellationToken cancellationToken)
{
var country = _context.Countries.Where(x =>
x.Code == request.CountryID)).FirstOrDefault();
var newItem = new Domain.Entities.ValidIdcard
{
Institution = request.Institution,
Total = request.Total,
CountryID = country.number,
};
_context.ValidIdcards.Add(newItem);
await _context.SaveChangesAsync();
}
並在CreateValidIDCardsCommandValidator
中驗證這些字段。
現在看看ValidIDCardsForeigners
中的Create
命令。 Model
是:
public class CreateValidIDCardsForeignerCommandModel : IRequest<int>
{
public int Id { get; set; }
public int Total { get; set; }
public string Citizenship {get; set;}
public int CountryID{ get; set;} //foreign key to another table
}
Handler
看起來像:
public async Task<int> Handle(CreateValidIDCardsForeignersCommandModel request, CancellationToken cancellationToken)
{
var country = _context.Countries.Where(x =>
x.Code == request.CountryID)).FirstOrDefault();
var newItem = new Domain.Entities.ValidIdcardForeigner
{
Total = request.Total,
CountryID = country.number,
Citizenship = request.Citizenship;
};
_context.ValidIdcards.Add(newItem);
await _context.SaveChangesAsync();
}
如您所見, ValidIDCards
和ValidIDCardsForeigners
之間的區別在於Model
中的兩個字段和處理程序中不同new Domain.Entities.Entity
Handler
,問題是如果我想將字段CountryID
更改為string
(這是現實生活中發生的情況大部頭書)。 我需要為每個數據集編輯 40 個數據集、幾個命令和查詢(對於單個常見更改來說,這是 100 多個文件)。 此外,如果我想添加新的數據集,我需要將近一天的時間來復制和更改幾乎 80% 的相同代碼。
我考慮過制作一個全局CreateCommandModel
,我將在其中放置大多數數據集具有的所有字段(id, countryID, institution)
,然后在每個數據集中繼承,但這行不通,因為並非所有數據集都有這些字段,而且數據集很少有完全不同的領域。 我正在尋找一些設計模式的幫助,但找不到可以幫助我的。
所以,問題是如何重構這段代碼,所以當我需要更改一件事時,我不需要在 40 多個地方進行更改。
假設CreateValidIDCardsCommandModel
和CreateValidIDCardsForeignerCommandModel
具有相同的接口 IRequest:
public interface IRequest<T>
{
public T Id { get; set; }
public T CountryId { get; set; }
}
public class CreateValidIDCardsCommandModel : IRequest<int>
{
public int Id { get; set; }
public string Institution { get; set; }
public int Total { get; set; }
public int CountryId { get; set; }
}
public class CreateValidIDCardsForeignerCommandModel : IRequest<int>
{
public int Id { get; set; }
public int Total { get; set; }
public string Citizenship { get; set; }
public int CountryId { get; set; }
}
並且可以得出結論ValidIdcardForeigner
和ValidIdcard
共享相同的接口,因為它在以下代碼片段中使用
_context.ValidIdcards.Add(newItem);
因此我們可以通過添加參數U item
來減少Handle()
方法中的耦合。 所以我們將 object 的創建委托給Handle
方法的客戶端:
public async Task<T> Handle<T, U>(IRequest<T> request, U item,
CancellationToken cancellationToken)
{
var country = _context.Countries.Where(x =>
x.Code == request.CountryID)).FirstOrDefault();
_context.ValidIdcards.Add(Item);
await _context.SaveChangesAsync();
}
通過這樣做,我們不需要通過添加新的ValidIdcardForeigner
或ValidIdcard
來編輯Handle
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.