Вот как я это решил:
Я определил IMappingCreator
интерфейс:
public interface IMappingCreator
{
void CreateMappings();
}
Я реализовал класс с этим интерфейсом (я использую MEF в качестве контейнера DI, откуда берутся атрибуты), который помещается в контейнер DI как IMappingCreator
:
[Export(typeof(IMappingCreator))]
public class Mapping : IMappingCreator
{
private readonly IRefTypesLookup iRefTypesLookup;
[ImportingConstructor]
public Mapping(IRefTypesLookup rtl)
{
iRefTypesLookup = rtl;
}
public void CreateMappings()
{
Mapper.CreateMap<Journal, DisplayJournal>().AfterMap((j, dj) => dj.RefTypeName = iRefTypesLookup.Lookup(j.RefTypeID));
}
}
Наконец, при запуске приложения я извлекаю все экземпляры этого интерфейса в контейнере и вызываю для них метод CreateMappings
:
var mappings = container.GetExportedValues<IMappingCreator>();
foreach (IMappingCreator mc in mappings)
{
mc.CreateMappings();
}
Это делает начальную настройку довольно простой, так как все создание происходит в одном месте, и вы можете иметь столько создателей картирования, сколько захотите (однако, вы должны держать их как минимум, возможно, один раз за проект или около того, захватывая все необходимые сервисы для отображения определенных типов в этом проекте).