簡體   English   中英

如何重構此代碼以便我可以更輕松地進行更改

[英]How to refactor this code so I can make changes more easily

我的項目中有大約 40 個數據集 forms,分為 8 個數據集組。我會盡量簡單地解釋。 IDCards組為例。 我有 2 個數據集, ValidIDCardsValidIDCardsForeigners 目前,對於每個數據集,我的后端文件夾結構如下所示(我將使用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();
}

如您所見, ValidIDCardsValidIDCardsForeigners之間的區別在於Model中的兩個字段和處理程序中不同new Domain.Entities.Entity Handler ,問題是如果我想將字段CountryID更改為string (這是現實生活中發生的情況大部頭書)。 我需要為每個數據集編輯 40 個數據集、幾個命令和查詢(對於單個常見更改來說,這是 100 多個文件)。 此外,如果我想添加新的數據集,我需要將近一天的時間來復制和更改幾乎 80% 的相同代碼。

我考慮過制作一個全局CreateCommandModel ,我將在其中放置大多數數據集具有的所有字段(id, countryID, institution) ,然后在每個數據集中繼承,但這行不通,因為並非所有數據集都有這些字段,而且數據集很少有完全不同的領域。 我正在尋找一些設計模式的幫助,但找不到可以幫助我的。

所以,問題是如何重構這段代碼,所以當我需要更改一件事時,我不需要在 40 多個地方進行更改。

假設CreateValidIDCardsCommandModelCreateValidIDCardsForeignerCommandModel具有相同的接口 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; }
}

並且可以得出結論ValidIdcardForeignerValidIdcard共享相同的接口,因為它在以下代碼片段中使用

_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();
}

通過這樣做,我們不需要通過添加新的ValidIdcardForeignerValidIdcard來編輯Handle方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM