C# 更新模型中的公共字段

C# 更新模型中的公共字段,c#,asp.net,entity-framework,design-patterns,asp.net-core,C#,Asp.net,Entity Framework,Design Patterns,Asp.net Core,我有一些重复代码的问题。 我有多个具有相同属性的模型,如下所示: 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;

我有一些重复代码的问题。 我有多个具有相同属性的模型,如下所示:

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; 
现在,我正在编写相同的代码,以在控制器的多个操作中更新此字段,如下所示:

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核心Web API
。(如果有意义的话)。

您可以创建接口,例如:

public interface IMetaDataHolder{
    DateTimeOffset CreatedDate { get; set; }
    DateTimeOffset ModifiedDate { get; set; }
    AppUser CreatedBy { get; set; }
    AppUser ModifiedBy { get; set; }
}
将其添加到您的模型中,在base controller中,您可以使用类似的功能:

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方法,而不是重复分配调用。

您可以创建接口,例如:

public interface IMetaDataHolder{
    DateTimeOffset CreatedDate { get; set; }
    DateTimeOffset ModifiedDate { get; set; }
    AppUser CreatedBy { get; set; }
    AppUser ModifiedBy { get; set; }
}
将其添加到您的模型中,在base controller中,您可以使用类似的功能:

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方法,而不是重复分配调用。

您可以使用这些属性创建一个基本模型,如
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模型)
来调用
Create()
Update()
方法:

public void WriteAuditInformation(AuditedEntity model)
{
    model.CreatedBy = user;
    model.CreatedDate = now;
    model.ModifiedBy = user;
    model.ModifiedDate = now;
}
另一种方法是,如果您有权访问上下文类中的
user
变量是override
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 override int SaveChanges()
{
var now=DateTime.now;
var entities=ChangeTracker.Entries();
foreach(实体中的var项)
{
if(item.State==EntityState.Added)
{
item.CreatedBy=用户;
item.CreatedDate=now;
item.ModifiedBy=用户;
item.ModifiedDate=现在;
}
else if(item.State==EntityState.Modified)
{
item.ModifiedBy=用户;
item.ModifiedDate=现在;
}
}
返回base.SaveChanges();
}

您可以使用这些属性创建一个基本模型,如
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模型)
来调用
Create()
Update()
方法:

public void WriteAuditInformation(AuditedEntity model)
{
    model.CreatedBy = user;
    model.CreatedDate = now;
    model.ModifiedBy = user;
    model.ModifiedDate = now;
}
另一种方法是,如果您有权访问上下文类中的
user
变量是override
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 override int SaveChanges()
{
var now=DateTime.now;
var entities=ChangeTracker.Entries();
foreach(实体中的var项)
{
if(item.State==EntityState.Added)
{
item.CreatedBy=用户;
item.CreatedDate=now;
item.ModifiedBy=用户;
item.ModifiedDate=现在;
}
else if(item.State==EntityState.Modified)
{
item.ModifiedBy=用户;
item.ModifiedDate=现在;
}
}
返回base.SaveChanges();
}

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