在两个实体之间创建映射的最佳方法,其中另一个实体来自另一个上下文

时间:2019-06-21 17:30:53

标签: .net-core automapper automapper-8

嗨,我想在两个实体(源:用户,目标:UserInfosDto)之间创建一个映射,而目标DTO的一个成员(UserItemPreference)需要来自另一个上下文中的第三个实体的信息。

public class UserInfosDto
{
    //public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }

    public UserItemPreferencesDto UserItemPreferences { get; set; }
}
public class UserItemPreferencesDto
{
    public bool SeeActuality { get; set; }
    public bool IsInEditorMode { get; set; }
}
public class User
{
    public string IdentityId { get; set; }
    //...
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

public class UserIdentity
{
    public string IdentityId { get; set; }
    //...  
    public bool SeeActuality { get; set; }
    public bool IsInEditorMode { get; set; }  
}

User和UserIdentity来自不同的数据库,但是具有公共属性IdentityId。我考虑过要使用ITypeConverter注入UserIdentity dbContext。问题是我找不到仅在一个成员上使用ITypeConverter的方法。

1 个答案:

答案 0 :(得分:1)

使用IValueResolver代替,它允许解析单独的成员而不是完整类型。

对于您上面的情况,它看起来像

public class UserItemPreferencesResolver
    : IValueResolver<User, UserInfosDto, UserItemPreferencesDto>
{
    private readonly UserEntityDbContext _dbContext;

    public UserItemPreferencesResolver(UserEntityDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public UserItemPreferencesDto Resolve(
        User source,
        UserInfosDto destination,
        UserItemPreferencesDto destinationMember,
        ResolutionContext context
        )
    {
        UserItemPreferencesDto preferences = /* resolve from _dbContext (and transform) */
        return preferences;
    }
}

您通过创建映射

CreateMap<User, UserInfosDto>()
    .ForMember(
        dest => dest.UserItemPreferences, 
        opt => opt.MapFrom<UserItemPreferencesResolver>()
    );