我使用实体框架并想使用 DDD 原则。但是,有一些关于实体的信息位于什么是日志记录/持久性信息和什么是关于域对象的信息之间。
我的情况是这些被放在一个抽象基类中,所有实体都继承自:
public abstract class BaseEntity: IBaseEntity
{
/// <summary>
/// The unique identifier
/// </summary>
public int Id { get; set; }
/// <summary>
/// The user that created this instance
/// </summary>
public User CreatedBy { get; set; }
/// <summary>
/// The date and time the object was created
/// </summary>
public DateTime CreatedDate { get; set; }
/// <summary>
/// Which user was the last one to change this object
/// </summary>
public User LastChangedBy { get; set; }
/// <summary>
/// When was the object last changed
/// </summary>
public DateTime LastChangedDate { get; set; }
/// <summary>
/// This is the status of the entity. See EntityStatus documentation for more information.
/// </summary>
public EntityStatus EntityStatus { get; set; }
/// <summary>
/// Sets the default value for a new object
/// </summary>
protected BaseEntity()
{
CreatedDate = DateTime.Now;
EntityStatus = EntityStatus.Active;
LastChangedDate = DateTime.Now;
}
}
现在,如果不提供日期和时间,就无法实例化域对象。但是,我觉得这是放置它的错误位置。我真的可以为两者争辩。也许它根本不应该与域混合?
由于我使用的是 EF Code First,因此将其放在那里是有意义的,否则我还需要创建从 DAL 中的基类继承的新类,复制代码并需要映射到域对象和 MVC 模型看起来确实比上面的方法更混乱。
问题:
可以在域模型中使用 DateTime.Now 吗?您使用 DDD 和 EF Code First 将此类信息放在哪里?应该在域对象中设置用户还是在业务层中要求它?
更新
我认为 jgauffin 在这里是正确的答案——但这确实是一个非常根本的变化。然而,在我寻找替代解决方案时,我几乎已经解决了这个问题。我使用 ChangeTracker.Entries 来查找是否添加或修改了实体并相应地设置字段。这是在我的 UnitOfWork Save() 方法中完成的。
问题是加载导航属性,如用户(日期时间设置正确)。这可能是因为用户是实体继承的抽象基类的属性。我也不喜欢在里面放字符串,但是它可能会为某人解决一些简单的场景,所以我在这里发布解决方案:
public void SaveChanges(User changedBy)
{
foreach (var entry in _context.ChangeTracker.Entries<BaseEntity>())
{
if (entry.State == EntityState.Added)
{
entry.Entity.CreatedDate = DateTime.Now;
entry.Entity.LastChangedDate = DateTime.Now;
entry.Entity.CreatedBy = changedBy;
entry.Entity.LastChangedBy = changedBy;
}
if (entry.State == EntityState.Modified)
{
entry.Entity.CreatedDate = entry.OriginalValues.GetValue<DateTime("CreatedDate");
entry.Entity.CreatedBy = entry.OriginalValues.GetValue<User>("CreatedBy");
entry.Entity.LastChangedDate = DateTime.Now;
entry.Entity.LastChangedBy = changedBy;
}
}
_context.SaveChanges();
}