首页 > 解决方案 > 如何跨层移动数据(MVC5 + EF6 + DDD)?

问题描述

我们有一个使用 DDD 原则的 MVC 5 应用程序。我需要将数据从 Base Controller 发送到 Base Repository,这样我就可以记录哪些用户执行了操作以进行审计。应用程序结构为:Presentation (MVC 5) > Application (AppService) > Domain (Service) > Infra (Repository)。这个想法是让每一层尽可能地相互独立。

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

标签: asp.net-mvcentity-frameworkdomain-driven-design

解决方案


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

    class AuditableDto
{
    public string Username { get; set; }

    public string ModifedBy { get; set; }

    public DateTime ModifiedDate { get; set; }
}

对于您的可审核实体,您也需要这样的基类。

    class AuditableEntity
{
    public string Username { get; set; }

    public string ModifedBy { get; set; }

    public DateTime ModifiedDate { get; set; }
}

然后,您可以为从 UI 到控制器中的操作方法的每个请求创建一个通用过滤器,以在您的 AuditableDtos 中添加您需要的元数据,并以同样的方式将此信息传播到实体。在 DDD 中,您应该遵循 Persistence Ignorance 和 Infrastructure ignorance 的原则,所有层都应该依赖于 Domain 层。


推荐阅读