/// <summary>
/// Executes the code generation workflow.
/// </summary>
public CodeWriterOutput GenerateCode(CodeGenerationOptions options)
{
// Step 1 - Parse the code generation options and create the code provider.
codeGenerationOptions = CodeGenerationOptionsParser.ParseCodeGenerationOptions(options);
CreateCodeProvider();
ExtendedCodeDomTree extendedCodeDomTree;
MetadataSet metadataSet = null;
if (options.GenerateDataContracts)
{
// Step 2 - Build the set of XML schemas.
XmlSchemas schemas = MetadataFactory.GetXmlSchemas(codeGenerationOptions.MetadataResolverOptions);
// Step 3 - Generate the data contract code and get the CodeNamespace.
DataContractGenerator dataContractGenerator = new DataContractGenerator(schemas, codeGenerationOptions.PrimaryOptions, codeProvider);
CodeNamespace codeNamespace = dataContractGenerator.GenerateCode();
// Step 4 - Wrap the CodeDOM in the custom object model.
extendedCodeDomTree = new ExtendedCodeDomTree(codeNamespace, codeGenerationOptions.WriterOptions.Language, null);
}
else
{
// Step 2 - Build the service metadata.
metadataSet = MetadataFactory.GetMetadataSet(codeGenerationOptions.MetadataResolverOptions);
// Step 3 - Generate the client/service code and get the CodeNamespace.
ClientServiceGenerator clientServiceGenerator = new ClientServiceGenerator(metadataSet, codeGenerationOptions.PrimaryOptions, codeProvider);
CodeNamespace codeNamespace = clientServiceGenerator.GenerateCode();
// Step 4 - Wrap the CodeDOM in the custom object model.
extendedCodeDomTree = new ExtendedCodeDomTree(codeNamespace, codeGenerationOptions.WriterOptions.Language, clientServiceGenerator.Configuration);
}
// Step 5 - Apply the code decorations.
CodeDecorators decorators = new CodeDecorators(metadataSet);
decorators.ApplyDecorations(extendedCodeDomTree, codeGenerationOptions.CustomOptions);
// Step 6 - Restore the original CodeDOM.
CodeNamespace cns = extendedCodeDomTree.UnwrapCodeDomTree();
// Step 6 - Finally, write out the code to physical files.
return CodeWriter.Write(cns, extendedCodeDomTree.Configuration, codeGenerationOptions.WriterOptions, extendedCodeDomTree.TextFiles, codeProvider);
}