We generated DTO from LLBLGen instead of using T4.
We needed to create a DTO from Entity. These are not technically POCOs because they have a ToEntity() and FromEntity() method, but maybe this will work for you.
We created the IDTO<T> interface, which was then implemented by the DTO classes (one for each object). Instead of modifying entity patterns, we added DTOExtension methods that convert Entity to DTO (as well as many other helper transforms).
Here are the template files that you can use in LLBLGen v2.6. The template designer in version 3 is much easier to use, and you can convert most of this code to version 3 if you need to.
File: entityDTOInterface.template
using System; using System.ComponentModel; using System.Collections; using System.Runtime.Serialization; using <[RootNamespace]>.HelperClasses; using <[RootNamespace]>.EntityClasses; using SD.LLBLGen.Pro.ORMSupportClasses; namespace <[RootNamespace]>.DTOClasses {
File: entityDTO.template
using System; using System.ComponentModel; using System.Collections; using System.Runtime.Serialization; using <[RootNamespace]>.HelperClasses; using <[RootNamespace]>.EntityClasses; using SD.LLBLGen.Pro.ORMSupportClasses; namespace <[RootNamespace]>.DTOClasses { <[ UserCodeRegion "AdditionalNamespaces" ]>
File: dtoExtensions.template
using System; using System.Collections.Generic; using System.Linq; using <[RootNamespace]>; using <[RootNamespace]>.EntityClasses; using <[RootNamespace]>.CollectionClasses; using <[RootNamespace]>.DTOClasses; using <[RootNamespace]>.HelperClasses; namespace <[RootNamespace]>.DTOClasses { /// <summary> /// Generates extension methods for converting Entities to DTOs /// This class is generated. Do not modify. /// </summary> public static <[If UsePartialClasses]>partial <[EndIf]>class Extensions { <[If HasEntity]><[Foreach Entity]> /// <summary>Create a <[CurrentEntityName]> DTO from a <[CurrentEntityName]> entity</summary> /// <returns>The DTO created</returns> public static <[CurrentEntityName]>DTO ToDTO(this <[CurrentEntityName]>Entity entity) { <[CurrentEntityName]>DTO dto = null; if (entity != null) dto = new <[CurrentEntityName]>DTO(entity); return dto; } /// <summary>Create a list of <[CurrentEntityName]>DTO from a <[CurrentEntityName]>Collection</summary> /// <returns>The DTO list created</returns> public static List<<[CurrentEntityName]>DTO> ToDTOs(this <[CurrentEntityName]>Collection collection) { List<<[CurrentEntityName]>DTO> dtoList = new List<<[CurrentEntityName]>DTO>(collection.Count); foreach(<[CurrentEntityName]>Entity entity in collection) dtoList.Add(new <[CurrentEntityName]>DTO(entity)); return dtoList; } /// <summary>Create a list of <[CurrentEntityName]>DTO from a List of <[CurrentEntityName]> entities</summary> /// <returns>The DTO list created</returns> public static List<<[CurrentEntityName]>DTO> ToDTOs(this List<<[CurrentEntityName]>Entity> entities) { return entities.ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e)); } /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary> /// <returns>The DTO list created</returns> public static List<<[CurrentEntityName]>DTO> ToDTOs(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities) { return queryableEntities.ToList().ConvertAll<<[CurrentEntityName]>DTO>(e => new <[CurrentEntityName]>DTO(e)); } /// <summary>From the queryable object, get a list of <[CurrentEntityName]>DTO</summary> /// <returns>The DTO list created</returns> public static <[CurrentEntityName]>DTO FirstDTO(this IQueryable<<[CurrentEntityName]>Entity> queryableEntities) { <[CurrentEntityName]>DTO dto = null; <[CurrentEntityName]>Entity firstEntity = queryableEntities.First(); if (firstEntity != null) dto = new <[CurrentEntityName]>DTO(firstEntity); return dto; } <[NextForeach]><[EndIf]> #region Custom code <[ UserCodeRegion "CustomDTOCode" ]> // __LLBLGENPRO_USER_CODE_REGION_START CustomDTOCode // __LLBLGENPRO_USER_CODE_REGION_END <[ EndUserCodeRegion ]>
FILE: DTO.tasks
<?xml version="1.0" ?> <taskGroup xmlns="http://sd/llblgen/pro/taskGroupElementDefinitions.xsd" name="DTO Templates" isOptional="false" description="General group of tasks which are used DTO templates."> <supportedPlatforms> <platform name=".NET 3.5" /> </supportedPlatforms> <supportedTemplateGroups> <templateGroup name="SelfServicing" /> </supportedTemplateGroups> <taskGroup name="Create Directories"> <task name="DTODirectoryCreator" assemblyFilename="SD.LLBLGen.Pro.TaskPerformers.dll" taskPerformerClass="SD.LLBLGen.Pro.TaskPerformers.DirectoryCreator"> <parameters> <parameter name="folderToCreate" defaultValue="DTOClasses" isOptional="false" description="The folder to create" /> <parameter name="failWhenExistent" defaultValue="false" isOptional="true" description="Flag to signal what to do when the folder already exists. Overrules clearWhenExistent" valueType="boolean" /> <parameter name="clearWhenExistent" defaultValue="false" isOptional="true" description="Flag to signal if an existing folder has to be cleared first. Overruled by failWhenExistent" valueType="boolean" /> </parameters> </task> </taskGroup> <taskGroup name="Create DTO Classes" description="Create DTO Classes"> <task name="DTOInterfaceCreator" assemblyFilename="SD.LLBLGen.Pro.TaskPerformers.dll" taskPerformerClass="SD.LLBLGen.Pro.TaskPerformers.CodeEmitter"> <parameters> <parameter isOptional="false" name="destinationFolder" defaultValue="DTOClasses" /> <parameter isOptional="false" name="failWhenExistent" defaultValue="false" /> <parameter isOptional="false" name="filenameFormat" defaultValue="IDTO.cs" /> <parameter isOptional="false" name="templateID" defaultValue="SD_DTOInterfaceTemplate" /> <parameter isOptional="false" name="emitType" defaultValue="generic" /> </parameters> </task> <task name="DTOClassCreator" assemblyFilename="SD.LLBLGen.Pro.TaskPerformers.dll" taskPerformerClass="SD.LLBLGen.Pro.TaskPerformers.CodeEmitter"> <parameters> <parameter isOptional="false" name="destinationFolder" defaultValue="DTOClasses" /> <parameter isOptional="false" name="failWhenExistent" defaultValue="false" /> <parameter isOptional="false" name="filenameFormat" defaultValue="[elementName]DTO.[extension]" /> <parameter isOptional="false" name="templateID" defaultValue="SD_DTOTemplate" /> <parameter isOptional="false" name="emitType" defaultValue="allEntities" /> </parameters> </task> <task name="DTOExtentionsCreator" assemblyFilename="SD.LLBLGen.Pro.TaskPerformers.dll" taskPerformerClass="SD.LLBLGen.Pro.TaskPerformers.CodeEmitter"> <parameters> <parameter isOptional="false" name="destinationFolder" defaultValue="DTOClasses" /> <parameter isOptional="false" name="failWhenExistent" defaultValue="false" /> <parameter isOptional="false" name="filenameFormat" defaultValue="DTOExtensions.cs" /> <parameter isOptional="false" name="templateID" defaultValue="SD_DTOExtentionsTemplate" /> <parameter isOptional="false" name="emitType" defaultValue="generic" /> </parameters> </task> </taskGroup> </taskGroup>
Finally add the following to the appropriate location in the * .preset file. This will define the task of generating the code above within your predefined generation.
<taskGroupPreset name="DTO Templates"> <taskGroupPreset name="Create Directories"> <taskPreset name="DTODirectoryCreator" /> </taskGroupPreset> <taskGroupPreset name="Create DTO Classes"> <taskPreset name="DTOInterfaceCreator" /> <taskPreset name="DTOEntityInterfaceCreator" /> <taskPreset name="DTOBaseClassCreator" /> <taskPreset name="DTOClassCreator" /> <taskPreset name="DTOExtentionsCreator" /> </taskGroupPreset> </taskGroupPreset>