Data Mapping & Transformation
The Extensions.DataMapping package provides a declarative data mapping engine with field-level transformations, format conversion, and schema validation.
Installation
dotnet add package WorkflowFramework.Extensions.DataMapping
dotnet add package WorkflowFramework.Extensions.DataMapping.Formats # JSON/XML/CSV converters
dotnet add package WorkflowFramework.Extensions.DataMapping.Schema # schema validation
Core Concepts
DataMappingProfile
A profile defines how fields map from source to destination:
using WorkflowFramework.Extensions.DataMapping.Abstractions;
var profile = new DataMappingProfile
{
Name = "OrderToInvoice"
};
profile.Mappings.Add(new FieldMapping("Customer.Name", "BillTo.FullName"));
profile.Mappings.Add(new FieldMapping("Customer.Email", "BillTo.Email"));
profile.Mappings.Add(new FieldMapping("Total", "Amount", new[]
{
new TransformerRef("round", new Dictionary<string, string?> { ["decimals"] = "2" })
}));
profile.Defaults["BillTo.Currency"] = "USD";
IDataMapper
var mapper = new DataMapper(transformerRegistry);
var result = await mapper.MapAsync(profile, sourceObj, destObj);
if (result.IsSuccess)
Console.WriteLine($"Mapped {result.MappedFieldCount}/{result.TotalFieldCount} fields");
else
Console.WriteLine($"Errors: {string.Join(", ", result.Errors)}");
Field Transformers
Register custom transformers via IFieldTransformerRegistry:
var registry = new FieldTransformerRegistry();
registry.Register("uppercase", (value, args) =>
Task.FromResult<object?>(value?.ToString()?.ToUpperInvariant()));
registry.Register("round", (value, args) =>
{
var decimals = int.Parse(args?["decimals"] ?? "2");
return Task.FromResult<object?>(Math.Round(Convert.ToDecimal(value), decimals));
});
Source Readers & Destination Writers
The ISourceReader and IDestinationWriter abstractions support:
- JSON — read/write JSON documents by path
- XML — XPath-based reading/writing
- Dictionary — flat key-value pairs
- Object — .NET object property access via reflection
Format Conversion
The DataMapping.Formats package provides converters between JSON, XML, and CSV:
// Convert JSON to XML
var xml = await FormatConverter.ConvertAsync(jsonString, DataFormat.Json, DataFormat.Xml);
Schema Validation
Validate data against JSON Schema or XML Schema before or after mapping:
// JSON Schema validation
var validator = new JsonSchemaValidator(schemaJson);
var errors = validator.Validate(dataJson);
Batch Processing
BatchProcessStep maps collections of items in bulk:
using WorkflowFramework.Extensions.DataMapping.Batch;
var batchStep = new BatchProcessStep(mapper, profile, "InputItems", "OutputItems");
Builder Extensions
using WorkflowFramework.Extensions.DataMapping.Builder;
var workflow = new WorkflowBuilder()
.MapData(profile, sourceReader, destinationWriter)
.Build();
Tip
Combine data mapping with integration patterns like Message Translator and Content Enricher for powerful ETL workflows.