Ho anche utilizzare un programma di avvio automatico per gestire questo genere di cose compito di avvio. In realtà, io uso una catena di bootstrapper perché sono pazzo del genere. Dal punto di vista di Automapper, abbiamo scoperto che era molto più pulito fare alcune classi AutoMappingBuddy e decorarle con un attributo. Quindi colleghiamo i mappatori tramite alcune chiamate di riflessione (non a buon mercato, ma sparano solo una volta al via). Questa soluzione è stata scoperta dopo che ci siamo stancati di trovare un problema AutoMapper nella riga 841 di un file di 1200+ righe.
Ho pensato di postare il codice, ma non posso davvero chiamarlo così purdy. In ogni caso, ecco qui:
In primo luogo, una semplice interfaccia per i AutoMappingBuddies:
public interface IAutoMappingBuddy
{
void CreateMaps();
}
In secondo luogo, un po 'attributo per fornire po' di colla:
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;
}
}
In terzo luogo, l'AutoMappingEngine. È il luogo dove avviene 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>>();
}
Kinda schiaffeggiato insieme in un'ora o giù di lì, ci sono probabilmente più eleganti modi per arrivarci.
Grazie Jimmy! Ottimo lavoro su questo strumento, oscilla su più livelli. Mi piace la bandiera sul bootstrapper. Stasera lo porterò nel mio codice. – KevDog
Grazie! Questo mi ha aiutato molto. Per quanto riguarda lo strumento, è molto potente lo adoro! – Rushino