Преобразование Autoapper Many To One
Как преобразовать значения многих свойств из исходного объекта в один тип в целевом объекте? Могу ли я использовать в этом случае Value Resolvers? Или, может быть, есть лучшее решение?
Документация
Вот пример из документация - одна к одному преобразованию
Mapper.CreateMap<Source, Destination>()
.ForMember(dest => dest.Total,
opt => opt.ResolveUsing<CustomResolver>().FromMember(src => src.SubTotal));
Mapper.CreateMap<OtherSource, OtherDest>()
.ForMember(dest => dest.OtherTotal,
opt => opt.ResolveUsing<CustomResolver>().FromMember(src => src.OtherSubTotal));
public class CustomResolver : ValueResolver<decimal, decimal> {
// logic here
}
Case
Я хочу передать два объекта в одно (много к одному преобразованию). Например:
public class Document
{
public int CurrencyId {get; set;}
public int ExchangeRateId {get; set;}
}
public class DocumentDto
{
public Currency Currency {get; set;}
}
public class CurrencyDetails
{
public Currency Currency {get; private set;}
public ExchangeRate ExchangeRate {get; private set;}
public CurrencyDetails(Currency currency, ExchangeRate exchangeRate)
{
Currency = currency;
ExchangeRate = exchangeRate;
}
}
Я хотел бы добиться чего-то подобного:
public class CurrencyResolver : ValueResolver<int, int, CurrencyDetails>
{
protected override Currency ResolveCore(int currencyId, int exchangeRateId)
{
var currency = new Currency(currencyId); //simplified logic
var exchangeRate = new ExchangeRate(exchangeRateId);
var currencyDetails = new CurrencyDetails(currency, exchangeRate);
return currencyDetails;
}
}
Я знаю, что могу передать весь объект в качестве исходного объекта, но для меня это не решение:
ValueResolver<Document, Currency>
Я не могу использовать полный объект, потому что у меня много типов документов, и я не хочу создавать новый распознаватель для каждого документа. Игнорирование элемента (для ручного преобразования) также не допускается в моем случае. Логика преобразования валюты должна быть выполнена с помощью AutoMapper.
Для меня важно, чтобы преобразование происходило в фоновом режиме (при преобразовании основного объекта).
Например:
Document document;
var documentDto = Mapper.Map<DocumentDto>(document); // and in this moment i have proper CurrencyDetails object!
Спасибо за ваш совет.
Мои решения
Я решил два решения, но мне они не нравятся (soooo dirty)
Решение 1 - заверните класс с интерфейсом:
public interface ICurrencyHolder
{
int CurrencyId {get; set;}
int ExchangeRateId {get; set;}
}
public class Document : ICurrencyHolder
{
public int CurrencyId {get; set;}
public int ExchangeRateId {get; set;}
}
и использовать преобразователь со следующими параметрами:
ValueResolver<ICurrencyHolder, Currency>
Решение 2 - взять в качестве исходного объекта элемента источника и принять значения через отражение
ValueResolver<object, Currency>
Это ужасно!