Как использовать IMemberValueResolver с аргументом конструктора - PullRequest
0 голосов
/ 30 апреля 2018

Например, если у меня есть тип IMemberValueResolver:

Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Destination>()
    .ForMember(dest => dest.Total,
        opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.SubTotal));
cfg.CreateMap<OtherSource, OtherDest>()
    .ForMember(dest => dest.OtherTotal,
        opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.OtherSubTotal));
});

public class CustomResolver : IMemberValueResolver<object, object, decimal, decimal> {
    public decimal Resolve(object source, object destination, decimal sourceMember, decimal destinationMember, ResolutionContext context) {
// logic here
    }
}

Что если мой CustomResolver принимает параметр в конструкторе, например:

public class CustomResolver : IMemberValueResolver<object, object, decimal, decimal> {
    public CustomResolver(string text){
    }
    public decimal Resolve(object source, object destination, decimal sourceMember, decimal destinationMember, ResolutionContext context) {
// logic here
    }
}

Как мне тогда создать карту для пользовательского распознавателя типа IMemberValueResolver? Мы можем попытаться поставить экземпляр напрямую:

Mapper.Initialize(cfg => cfg.CreateMap<Source, Destination>()
    .ForMember(dest => dest.Total,
        opt => opt.ResolveUsing(new CustomResolver("Text"))
    );

Но как в этом случае мы передаем, какой параметр источника мы хотим использовать для сопоставления в resolver?

1 Ответ

0 голосов
/ 30 апреля 2018

Преты много это:

.ForMember(dest => dest.Total,
        opt => opt.ResolveUsing(new CustomResolver("argument"), src => src.SubTotal));

Но проблема в том, что у вас есть DI, связанный также в резольвере ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...