首页 > 解决方案 > Automapper - 避免重复

问题描述

我的架构是 WEBAPI.NET Core 2.2 。

它是一个基本的 N 层架构:控制器-> 服务/域层-> 数据层(dapper)-> 存储过程。

在我 80% 的数据库表中,我有“审计”列:

我在我的 DTO 和我的实体对象中使用一个接口:

 public interface ITrackable
    {
        public string CreatedBy{ get; set; }

        public string? UpdatedBy{ get; set; }

        public DateTime CreationDate{ get; set; }

        public DateTime? UpdateDate{ get; set; }
    }

用户“CreatedBy”和“UpdatedBy”来自 JWT 令牌,所以我需要。

我在域层有一项服务,它为我提供来自 JWT 令牌的用户:

public interface IUserService
{
    UserModel GetCurrentUser();
}

问题: 每当我使用自动映射器将我的 DTO 对象转换为我的实体时,我必须设置属性“CreatedBy”和“UpdatedBy”:

public void DoSomethingInMyDomainLayer(Something SomethingDTO) //come from Controller
{
    var currentUser = _userService.GetCurrentUser();
    var myEntity= _mapper.Map<MyEntity>(SomethingDTO);
    myEntity.CreatedBy= currentUser.Email; // this code can be found in many places
    _datalayer.DoSomething(myEntity)
}

public void DoSomethingElseInMyDomainLayer(SomethingElse SomethingElseDTO) //come from Controller
{
    var currentUser = _userService.GetCurrentUser();
    var myOtherEntity= _mapper.Map<MyOtherEntity>(SomethingElseDTO);
    myOtherEntity.CreatedBy= currentUser.Email; // this code can be found in many places
    _datalayer.DoSomethingElse(myOtherEntity)
}

我不想在具有不同实体的所有方法中重复此代码

 myEntity.CreatedBy= currentUser.Email

**备注1 **

我不能使用配置文件自动映射器,因为我也会重复:

CreateMap<MyDTO, MyEntity>()
                .ForMember(x => x.CreatedBy, opt => CallMyUserServiceToGetUserFromJwtToken);
CreateMap<MyDTO2, MyEntity2>()
                .ForMember(x => x.CreatedBy, opt => CallMyUserServiceToGetUserFromJwtToken);

**备注2 **

我想要一种通用映射:

像“如果我的实体是“ITrackable”,我会自动将 UserCreatedBy 映射到我的实体上。

你有什么想法?

谢谢

PS:对不起我的英语,这不是我的母语

标签: c#asp.net-web-apiautomapper

解决方案


推荐阅读