asp.net-mvc - 如何跨层移动数据(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);
}
解决方案
我建议执行以下操作,从您的控制器或应用程序层您需要在数据库中传输和存储数据,对吗?在这种情况下,您需要创建一个基本 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 层。
推荐阅读
- c# - 在 C# 中,当应用程序以管理员身份运行时,如何更改登录用户的 HKEY_CURRENT_USER?
- c# - 尝试从 IIS 中的 API 访问文件夹时出现“用户名或密码不正确”
- linux - 插入设备时使用 android reverse 通过 USB 启动 ssh
- python - 如何对熊猫组中的每组数据应用函数
- excel - 我无法刷新导入到 Excel 电子表格中的 SharePoint 列表数据,该电子表格已上传到同一网站,使用 Excel Web Access 显示
- javascript - Vue3:v-model的问题,它不更新组件
- java - 在 Spring webflux 中抛出异常 vs Mono.error()
- android - Unity,JSON 文件 - Android 问题,找不到我的 JSON 文件
- visual-studio-code - VisualStudioCode 在调试时打印到终端时引发错误
- blockchain - 坚固性 v0.6.0。后备功能。他们需要什么?