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()
...
测试使用: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()
...