更新模型中的公共字段
本文关键字:字段 模型 更新 | 更新日期: 2023-09-27 18:35:28
我对重复的代码有一些问题。我有多个具有相同属性的模型,如下所示:
public DateTimeOffset CreatedDate { get; set; }
public DateTimeOffset ModifiedDate { get; set; }
public virtual AppUser CreatedBy { get; set; }
public virtual AppUser ModifiedBy { get; set; }
现在我正在编写相同的代码来更新控制器的多个操作中的此字段,如下所示:
model.CreatedBy = user;
model.CreatedDate = now;
model.ModifiedBy = user;
model.ModifiedDate = now;
我想知道是否有任何方法或模式可以避免这种重复的代码?在这种情况下有什么最佳实践吗?我正在使用EntityFramework
和ASP.net Core Web API
.(如果这有意义的话)。
您可以使用这些属性创建一个基本模型,例如 AuditedEntity
public class AuditedEntity
{
public DateTimeOffset CreatedDate { get; set; }
public DateTimeOffset ModifiedDate { get; set; }
public virtual AppUser CreatedBy { get; set; }
public virtual AppUser ModifiedBy { get; set; }
}
在服务图层中,您可以有一个方法WriteAuditInformation(AuditedEntity model)
来调用Create()
和Update()
方法:
public void WriteAuditInformation(AuditedEntity model)
{
model.CreatedBy = user;
model.CreatedDate = now;
model.ModifiedBy = user;
model.ModifiedDate = now;
}
另一种方法是,如果您有权访问上下文类中的变量user
则覆盖SaveChanges()
方法:
public override int SaveChanges()
{
var now = DateTime.Now;
var entities = ChangeTracker.Entries<AuditedEntity>();
foreach (var item in entities)
{
if (item.State == EntityState.Added)
{
item.CreatedBy = user;
item.CreatedDate = now;
item.ModifiedBy = user;
item.ModifiedDate = now;
}
else if (item.State == EntityState.Modified)
{
item.ModifiedBy = user;
item.ModifiedDate = now;
}
}
return base.SaveChanges();
}
您可以创建接口,例如:
public interface IMetaDataHolder{
DateTimeOffset CreatedDate { get; set; }
DateTimeOffset ModifiedDate { get; set; }
AppUser CreatedBy { get; set; }
AppUser ModifiedBy { get; set; }
}
将其添加到您的模型中,在基本控制器中,您可以使用类似的东西:
protected void AssignMetaData(IMetaDataHolder metaDataHolder){
var now = DateTime.UtcNow; //or whatever
var user = Session.User; //or whatever
metaDataHolder.CreatedBy = user;
metaDataHolder.CreatedDate = now;
metaDataHolder.ModifiedBy = user;
metaDataHolder.ModifiedDate = now;
}
这样,在操作方法中,您可以只调用分配元数据方法,而不是重复赋值调用。