public ProxyGeneratorResult GenerateProxies(
CodeGeneratorConfig codeGeneratorConfig,
IDictionary<Type, IMap> mapDictionary) {
var maps = mapDictionary.Values;
var parallelMaps = maps.AsParallel();
// create code doms for the proxy classes
var trackingClasses =
parallelMaps.Select(m => this.CreateTrackingClass(m, codeGeneratorConfig));
var foreignKeyClasses =
parallelMaps.Select(m => this.CreateFkClass(m, mapDictionary, codeGeneratorConfig));
var updateClasses =
parallelMaps.Select(
m => this.CreateUpdateClass(m, mapDictionary, codeGeneratorConfig));
// extract metadata from maps
var typeHierarchy =
maps.Select(m => m.Type)
.Union(maps.SelectMany(m => m.Type.GetAncestorTypes()))
.ToArray();
var namespaces =
typeHierarchy.Select(m => m.Namespace)
.Distinct()
.Select(ns => new CodeNamespaceImport(ns));
var references = typeHierarchy.Select(t => t.Assembly)
.Distinct()
.Select(a => a.Location);
return new ProxyGeneratorResult {
ProxyTypes =
trackingClasses.Concat(foreignKeyClasses)
.Concat(updateClasses)
.ToArray(),
NamespaceImports = namespaces.ToArray(),
ReferencedAssemblyLocations = references.ToArray()
};
}