В документации описано, как использовать AutoMapper с платформой Microsoft DI. И там он просто перенаправляет в соответствующий пакет NuGet и статью , в которой описывается, как он ищет в текущем домене приложения все открытые типы и профили для их загрузки.
В ваших классах вам нужно просто вставить IMapper imapper
в конструктор, который просто делает то, что вы ожидаете.
Единственное следующее предостережение, с которым я столкнулся, было то, что не все мои сборки были загружены до того, как я вызвал services.AddAutoMapper()
в моем методе ConfigureServices()
. Но для этого случая я просто добавил простой вспомогательный метод, который будет вызываться до того, как DI начнет выполнять свою работу:
public static void LoadAllLocalAssemblies()
{
var entryAssembly = Assembly.GetEntryAssembly();
var location = entryAssembly.Location;
var path = Path.GetDirectoryName(location);
var files = Directory.EnumerateFiles(path, "*.dll");
foreach (var file in files)
{
try
{
Assembly.LoadFrom(file);
}
catch
{
}
}
}
После этого все сборки загружаются в текущий домен приложения, и пакет NuGet разрешает все классы, производные от Profile
. Мои обработчики вставляют IMapper mapper
в конструктор, и в моем методе я могу вызвать mapper.Map<MyDestination>(mySource)
, и он работает как положено.
Никаких фиктивных классов, интерфейсов или чего-либо еще не требуется.