c# - 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”代码做任何我想做的事情。
解决方案
这里的接口非常方便,实际上是它们的主要用途。定义通用接口并使用它。这应该是这样的
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());
}
}
推荐阅读
- python - 在 PySide2 中使用 invokeMethod 时使用 QGenericArgument / Q_ARG
- python-3.x - BeautifulSoup 未显示网站部分
- pg-dump - pg_dump 在 AgensGraph 中可用吗?
- mysql - 更新触发器导致目标表的列设置为零
- python-3.x - 散点图未在 csv 文件中的 matplotlib 中排序
- vb.net - 循环遍历表单中的所有面板
- gwt - GWT 未来计划
- json - JQ 1.5:时间戳/日期转换产生巨大的文件
- php - Laravel 5.5“MethodNotAllowedHttpException”的原因是什么
- dronekit-python - 获取ardupilot输出通道