Лучший способ создать карту между двумя объектами с одним из другого контекста - PullRequest
0 голосов
/ 21 июня 2019

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

Пользователь и UserIdentity происходят из разных баз данных, но имеют общее свойство IdentityId.Я думал об использовании ITypeConverter, в котором я бы вводил UserIdentity dbContext.Проблема в том, что я не могу найти способ использовать ITypeConverter только для одного участника.

1 Ответ

1 голос
/ 22 июня 2019

Вместо этого используйте 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>()
    );
...