2016-02-19 122 views
0

我有一些重复代码的问题。 我有这样的相同属性的多个型号:更新模型中的常见字段

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; 

我想知道有没有任何方法或模式,以避免这种重复的代码?在这种情况下是否有最佳做法? 我正在使用EntityFrameworkASP.net Core Web API。 (如果这是有道理的)。

回答

1

您可以创建一个基础模型像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(); 
} 
+0

谢谢,我接受你对'SaveChanges'方法的回答。 –

1

您可以创建接口,例如:

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; 
} 

这样在动作方法你可以调用AssignMetaData方法而不是重复分配调用。