在两个实体与来自另一个上下文的第三个实体之间创建映射的最佳方法

Best way to create a map between two entities with a third one from another context

嗨,我想在两个实体(来源:User,目标: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 的方法。

改为使用 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>()
    );