2016-02-19 29 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方法而不是重複分配調用。

相關問題