Лучший способ создать карту между двумя объектами с одним из другого контекста
Здравствуйте, я хотел бы создать карту между двумя объектами (источник: пользователь, цель: 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 ответ
Решение
Используйте 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>()
);