你可以使用這個Tuple
:
Mapper.CreateMap<Tuple<People, Phone>, PeoplePhoneDto>()
.ForMember(d => d.FirstName, opt => opt.MapFrom(s => s.Item1.FirstName))
.ForMember(d => d.LastName, opt => opt.MapFrom(s => s.Item1.LastName))
.ForMember(d => d.Number, opt => opt.MapFrom(s => s.Item2.Number));
如果你希望你可以使用不同的表示(列表,字典或別的東西),將所有這些模型聚集在一起的多個源模型資源。
上面的代碼應該優先放置在某個AutoMapperConfiguration文件中,一次全局設置,然後在適用時使用。
默認情況下,AutoMapper僅支持單個數據源。所以不可能直接設置多個數據源(沒有將數據包封裝在一個集合中),因爲那麼我們如何知道如果兩個源模型具有相同名稱的屬性?
有,雖然一些變通方法來實現這一目標:
public static class EntityMapper
{
public static T Map<T>(params object[] sources) where T : class
{
if (!sources.Any())
{
return default(T);
}
var initialSource = sources[0];
var mappingResult = Map<T>(initialSource);
// Now map the remaining source objects
if (sources.Count() > 1)
{
Map(mappingResult, sources.Skip(1).ToArray());
}
return mappingResult;
}
private static void Map(object destination, params object[] sources)
{
if (!sources.Any())
{
return;
}
var destinationType = destination.GetType();
foreach (var source in sources)
{
var sourceType = source.GetType();
Mapper.Map(source, destination, sourceType, destinationType);
}
}
private static T Map<T>(object source) where T : class
{
var destinationType = typeof(T);
var sourceType = source.GetType();
var mappingResult = Mapper.Map(source, sourceType, destinationType);
return mappingResult as T;
}
}
然後:
var peoplePhoneDto = EntityMapper.Map<PeoplePhoneDto>(people, phone);
但相當誠實,即使我使用AutoMapper對於已經幾年我從來沒有有需要使用來自多個來源的映射。 例如,在我單視圖模型中需要多個業務模型的情況下,我只是將這些模型嵌入到視圖模型類中。
因此,在你的情況是這樣的:
public class PeoplePhoneDto {
public People People { get; set; }
public Phone Phone { get; set; }
}
@Andrei雖然我同意這似乎相似,它是在它試圖解決問題的差異解決。從這個問題中很難理解它將如何應用於這個問題。 –
爲什麼不讓'PeoplePhoneDto'擁有'People'和'Phone'成員? – crush
因爲這不是我想要公開的。 –