también uso un programa previo para manejar este tipo de cosas tarea de inicio. En realidad, uso una cadena de bootstrappers porque estoy loco así. Automáticamente, encontramos que era mucho más limpio hacer algunas clases AutoMappingBuddy y decorarlas con un atributo. Luego conectamos los mapeadores a través de algunas llamadas de reflexión (no son baratas, pero solo disparan una vez al llegar). Esta solución fue descubierta después de que nos cansamos de encontrar un problema de AutoMapper en la línea 841 de un archivo de línea de más de 1200.
Pensé en publicar el código, pero realmente no puedo llamarlo así. De todos modos, aquí va:
En primer lugar, una interfaz sencilla para los AutoMappingBuddies:
public interface IAutoMappingBuddy
{
void CreateMaps();
}
En segundo lugar, un poco de atributo para proporcionar un poco de pegamento:
public class AutoMappingBuddyAttribute : Attribute
{
public Type MappingBuddy { get; private set; }
public AutoMappingBuddyAttribute(Type mappingBuddyType)
{
if (mappingBuddyType == null) throw new ArgumentNullException("mappingBuddyType");
MappingBuddy = mappingBuddyType;
}
public IAutoMappingBuddy CreateBuddy()
{
ConstructorInfo ci = MappingBuddy.GetConstructor(new Type[0]);
if (ci == null)
{
throw new ArgumentOutOfRangeException("mappingBuddyType", string.Format("{0} does not have a parameterless constructor."));
}
object obj = ci.Invoke(new object[0]);
return obj as IAutoMappingBuddy;
}
}
En tercer lugar, la AutoMappingEngine. Es el lugar donde sucede la magia:
public static class AutoMappingEngine
{
public static void CreateMappings(Assembly a)
{
Dictionary<Type, IAutoMappingBuddy> mappingDictionary = GetMappingDictionary(a);
foreach (Type t in a.GetTypes())
{
var amba =
t.GetCustomAttributes(typeof (AutoMappingBuddyAttribute), true).OfType<AutoMappingBuddyAttribute>().
FirstOrDefault();
if (amba!= null && !mappingDictionary.ContainsKey(amba.MappingBuddy))
{
mappingDictionary.Add(amba.MappingBuddy, amba.CreateBuddy());
}
}
foreach (IAutoMappingBuddy mappingBuddy in mappingDictionary.Values)
{
mappingBuddy.CreateMaps();
}
}
private static Dictionary<Type, IAutoMappingBuddy> GetMappingDictionary(Assembly a)
{
if (!assemblyMappings.ContainsKey(a))
{
assemblyMappings.Add(a, new Dictionary<Type, IAutoMappingBuddy>());
}
return assemblyMappings[a];
}
private static Dictionary<Assembly, Dictionary<Type, IAutoMappingBuddy>> assemblyMappings = new Dictionary<Assembly, Dictionary<Type, IAutoMappingBuddy>>();
}
Un poco juntaron en una hora o así, probablemente hay formas más elegantes para llegar allí.
Gracias Jimmy! Excelente trabajo en esta herramienta, oscila en múltiples niveles. Me gusta la bandera en el bootstrapper. Voy a estar cargando esto en mi código esta noche. – KevDog
Gracias! Esto me ayudó mucho. En cuanto a la herramienta, es muy potente, ¡me encanta! – Rushino