Вот как я ее решил:
Я определил 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));
}
}
Наконец, в моем запуске приложения, принести все instanc эс этого интерфейса в контейнере и вызвать метод CreateMappings
на них:
var mappings = container.GetExportedValues<IMappingCreator>();
foreach (IMappingCreator mc in mappings)
{
mc.CreateMappings();
}
Это делает первоначальную настройку довольно легко, так как все творение происходит в одном месте, и вы можете иметь столько создателей отображения, как вы хотите (однако вы должны свести их к минимуму, возможно, один раз за проект или так, захватив все необходимые службы для сопоставления конкретных типов в этом проекте).
Единственная причина, по которой я могу думать, что это было бы чисто организационно. У вас потенциально будет код сопоставления по всему вашему проекту. Если ваш объект домена изменяется или dtos может быть менее идеальным. Но мне любопытно узнать от других людей их мнение. – Daniel
Ну, я бы все равно сохранил код отображения в одном месте - то есть.этот класс, который будет захватывать все необходимые сервисы из контейнера DI. Мне просто нужно инициализировать отображение, а не полагаться на статический конструктор, выполняющий его автоматически. – Femaref
Для последней версии взгляните на [это] (http://stackoverflow.com/a/35431096/1977871), так что ответьте – VivekDev