我继承了一个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
所以我的Create和Edit剃须刀页面有很多重复的代码,如下所示:
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行的每一种模式?
注:我不能改变模型。但是我可以用“页面”代码做任何我想做的事。
发布于 2021-08-22 01:39:28
这里提供了非常方便的接口,它实际上是它们的主要用途。定义通用接口并使用它。应该是这样的
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());
}
}
https://stackoverflow.com/questions/68877857
复制相似问题