Automapper:映射到未知目的地/最新版本中缺少 GetAllTypeMaps

Automapper: Map to Unknown Destination / GetAllTypeMaps missing in latest Build

测试使用:Automapper 10.1.2-alpha.0.4 (MyGet Build)

我们想将我们的 DomainEvents 映射到 public 没有任何基础 classes 的合同,并将它们发布到消息 Queue/Topic。

因为它应该是动态映射,所以在映射到目标合约时我们不知道目标类型。

对于这种情况,我们有以下 Post 的解决方案: How can I use Automapper to map an object to an unknown destination type?如下:

public async Task Publish(DomainEvent domainEvent)
{
    this.logger.LogInformation("Publishing domain event. Event - {event}", domainEvent.GetType().Name);

    try
    {
        var publicEvent = this.MapToContract(domainEvent);

        await this.publishEndpoint.Publish(publicEvent);
    }
    catch (Exception ex)
    {
        this.logger.LogError("Unexpected exception while publishing domain event.", ex);
    }
}

private object MapToContract(object source)
{
    var sourceType = source.GetType();
    TypeMap? typeMap = null;

    try
    {
        typeMap = this.mapper.ConfigurationProvider
            .GetAllTypeMaps()
            .SingleOrDefault(map => map.SourceType == sourceType);
    }
    catch (InvalidOperationException)
    {
        throw new Exception($"Multiple types for {sourceType.FullName} available. Only one allowed");
    }

    return typeMap is null
        ? throw new Exception($"No type map for {sourceType.FullName} found!")
        : this.mapper.Map(source, sourceType, typeMap.DestinationType);
}

Publish(DomainEvent domainEvent) 每当引发域事件时都会被调用为事件接收器。

从上个版本开始,我们不能再使用MapToContract方法了,因为GetAllTypeMaps方法不可用了。我找不到任何解决方法。

public 事件示例 class:

public record EmployeeCreated(int Id, string Name, string FirstName);

有什么想法吗?

好的,遇到了同样的问题。 解决方案是使用内部扩展方法如下(参见https://docs.automapper.org/en/stable/11.0-Upgrade-Guide.html?highlight=internal#forallmaps-forallpropertymaps-advanced-and-other-missing-apis):

using AutoMapper.Internal;

...

this.mapper.ConfigurationProvider
   .Internal()
   .GetAllTypeMaps()
   ...