private static void MapRecursive(IMetadata metadata, Type entityType, Type dtoType, MetadataDto dtoMetadata) { dtoMetadata.AddMetadataItemRange(MapMetadataItems(metadata.MetadataItems)); foreach (var propertyInfo in entityType.GetProperties()) { if ((typeof(IAggregateRoot).IsAssignableFrom(propertyInfo.PropertyType) || typeof(IAggregateRoot).IsAssignableFrom(propertyInfo.PropertyType)) && metadata.HasChild(propertyInfo.PropertyType.FullName)) { var dtoPropertyName = TryFindDestinationPropertyName(entityType, dtoType, propertyInfo); if (dtoPropertyName == null) { continue; } var dtoPropertyInfo = dtoType.GetProperty(dtoPropertyName); if (typeof(IDataTransferObject).IsAssignableFrom(dtoPropertyInfo.PropertyType)) { MapRecursive( metadata.FindChildMetadata(propertyInfo.PropertyType.FullName), propertyInfo.PropertyType, dtoPropertyInfo.PropertyType, dtoMetadata.GetChildMetadata(dtoPropertyInfo.PropertyType.FullName)); } else { var subDtoPropertyMetadata = dtoMetadata.GetChildMetadata(dtoPropertyInfo.Name); var subPropertyMetadata = metadata.FindChildMetadata(propertyInfo.PropertyType.FullName); subDtoPropertyMetadata.AddMetadataItemRange( MapMetadataItems(subPropertyMetadata.MetadataItems)); } } else if (metadata.HasChild(propertyInfo.Name)) { var dtoPropertyName = PropertyNameMapper.GetDistinctDestinationPropertyName(entityType, dtoType, propertyInfo.Name); if (dtoPropertyName == null) { continue; } var subDtoPropertyMetadata = dtoMetadata.GetChildMetadata(dtoPropertyName); var subPropertyMetadata = metadata.FindChildMetadata(propertyInfo.Name); subDtoPropertyMetadata.AddMetadataItemRange( MapMetadataItems(subPropertyMetadata.MetadataItems)); } } }
/// <summary> /// Handles the metadata item dto. /// </summary> /// <typeparam name="T">The type of metadataitemdto.</typeparam> /// <param name="metadataDto">The metadata dto.</param> /// <param name="resourceName">Name of the resource.</param> /// <param name="apply">If set to <c>true</c> [apply].</param> /// <param name="metaDataItemToApply">The meta data item to apply.</param> /// <returns>A <see cref="System.Boolean"/></returns> private static bool HandleMetadataItemDto <T> (this MetadataDto metadataDto, string resourceName, bool apply, T metaDataItemToApply) where T : IMetadataItemDto { var done = false; var metaDataToApply = metadataDto; if (metaDataToApply.ResourceName != resourceName) { metaDataToApply = metadataDto.GetChildMetadata(resourceName); } var exists = metaDataToApply.FindMetadataItem <T> () != null; if (!apply && exists) { metaDataToApply.RemoveMetadataItem <T> (); done = true; } if (apply && !exists) { metaDataToApply.AddMetadataItem(metaDataItemToApply); done = true; } return(done); }