如何跨层移动数据(MVC5+EF6+DDD)



我们有一个使用DDD原理的MVC 5应用程序。我需要将数据从基本控制器发送到基本存储库,这样我就可以记录哪些用户执行了操作以进行审计。应用程序结构为:Presentation(MVC 5(>应用程序(AppService(>域(服务(>Infra(存储库(。这个想法是尽可能地保持每一层彼此独立。

在BaseController中,我有来自会话的日志用户,表示层中的所有类都可以访问:

    public ProfileApp ProfileApp
    {
        get { return Session?[Constantes.Session.PROFILE] == null ? CreateProfileApp() : (ProfileApp)Session[Constantes.Session.PROFILE]; }
        set { Session[Constantes.Session.PROFILE] = value; }
    }

我如何在Add方法中将这些信息获取到存储库中,声明如下:

public class RepositoryBase<TEntity> : IDisposable, IRepositoryBase<TEntity> where TEntity : BaseIdentity
{
    protected VGPartnerDBContext _Db;
    protected DbSet<TEntity> _DbSet;
    public RepositoryBase(VGPartnerDBContext p_VGPartnerDBContext)
    {
        _Db = p_VGPartnerDBContext;
        _DbSet = _Db.Set<TEntity>();
    }
    protected virtual T Add<T>(T obj) where T: BaseIdentity
    {
        return _Db.Set<T>().Add(obj);
    }
    
    public virtual TEntity Add(TEntity obj)
    {
        return Add<TEntity>(obj);
    }

我建议您执行以下操作,从您的控制器或应用程序层,您需要在DB中传输和存储数据,对吗?在这种情况下,您需要创建一个基本DTO

    class AuditableDto
{
    public string Username { get; set; }
    public string ModifedBy { get; set; }
    public DateTime ModifiedDate { get; set; }
}

同样,对于Auditable实体,您需要一个这样的基类。

    class AuditableEntity
{
    public string Username { get; set; }
    public string ModifedBy { get; set; }
    public DateTime ModifiedDate { get; set; }
}

然后,您可以为从UI到您的每个请求在控制器中的操作方法制作一个通用过滤器,将您需要的元数据添加到AuditableD中,并以相同的方式将这些信息提供给实体。在DDD中,您应该遵循持久性无知和基础设施无知的原则,所有层都应该依赖于域层。

最新更新