首页 > 解决方案 > C#:有什么聪明的方法可以消除这种冗余代码吗?

问题描述

我继承了一个 C# ASP.Net Core(现在是 .Net 5.0)项目,其中包含一堆这样的实体模型:

   public class Foo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string CreatedBy { get; set; }
        public DateTime CreatedAt { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string RDoxFindingsID { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string LastUpdatedBy { get; set; }
        public DateTime LastUpdatedAt { get; set; }
        public string F001 { get; set; }
        ...

   public class Bar
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string CreatedBy { get; set; }
        public DateTime CreatedAt { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string RDoxFindingsID { get; set; }
        [Column(TypeName = "varchar(36)")]
        public string LastUpdatedBy { get; set; }
        public DateTime LastUpdatedAt { get; set; }
        public string Q100 { get; set; }
        ... <= The same "header" fields (CreatedBy, CreatedAt, etc. etc) are copied/pasted at the top of each different model

所以我的创建和编辑剃须刀页面有很多重复的代码,如下所示:

public class CreateModel : PageModel
{
    ...
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        Foo.CreatedAt = DateTime.Now;
        Foo.CreatedBy = Findings.CreatedBy;
        Foo.LastUpdatedAt = DateTime.Now;
        Foo.LastUpdatedBy = Findings.CreatedBy;
        _context.Foo.Add(Foo);
        await _context.SaveChangesAsync();

        Bar.CreatedAt = DateTime.Now;
        Bar.CreatedBy = Findings.CreatedBy;
        Bar.LastUpdatedAt = DateTime.Now;
        Bar.LastUpdatedBy = Findings.CreatedBy;
        _context.Bar.Add(Bar);
        await _context.SaveChangesAsync();
       ...

问:有什么聪明的方法可以重构我的 C# 代码,这样我就可以编写一个方法来调用这些模型中的任何一个?没有为每个单独的模型一遍又一遍地复制/粘贴这 4-6 行中的每一行?

注意:我不能更改模型。但是我可以用“Pages”代码做任何我想做的事情。

标签: c#asp.net-coreentity-framework-core

解决方案


这里的接口非常方便,实际上是它们的主要用途。定义通用接口并使用它。这应该是这样的

class Foo : IEntity
{
    public Guid ID { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedAt { get; set; }
    public string RDoxFindingsID { get; set; }
    public string LastUpdatedBy { get; set; }
    public DateTime LastUpdatedAt { get; set; }
}

class Bar : IEntity
{
    public Guid ID { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedAt { get; set; }
    public string RDoxFindingsID { get; set; }
    public string LastUpdatedBy { get; set; }
    public DateTime LastUpdatedAt { get; set; }
}

//You can name whatever you want
interface IEntity
{
    Guid ID { get; set; }
    string CreatedBy { get; set; }
    DateTime CreatedAt { get; set; }
    string RDoxFindingsID { get; set; }
    string LastUpdatedBy { get; set; }
    DateTime LastUpdatedAt { get; set; }
}

class Program
{
    public static async Task<IActionResult> OnPostAsync(IEntity entity)
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        entity.CreatedAt = DateTime.Now;
        entity.CreatedBy = Findings.CreatedBy;
        entity.LastUpdatedAt = DateTime.Now;
        entity.LastUpdatedBy = Findings.CreatedBy;
        _context.Foo.Add(entity);
        await _context.SaveChangesAsync();
    }

    static async void Main(string[] args)
    {
        await OnPostAsync(new Foo());
    }
}

推荐阅读