我试图在我的应用程序中实现一些横切关注点,它使用AutoMapper在不同的DTO /消息对象之间进行映射。
说我有这个:
configuration.Map<MyMessage, MyEvent>()
。 MyEvent
实现IEvent
(这是一个没有属性的标记接口)。有没有办法要求AutoMapper将MyMessage
映射到IEvent
,并让它推断出&#34;哦,我有一个映射MyMessage
到MyEvent
,以及MyEvent
实施IEvent
&#34;?
这个(无效)示例显示了我想要实现的目标:
// IEvent is just a marker interface with no properties,
// and is implemented by all of the *Event classes
configuration.CreateMap<MyMessage, MyEvent>();
configuration.CreateMap<MyOtherMessage, MyOtherEvent>();
// etc.
// ... somewhere else in the code ...
public class MyCrossCuttingThing<TMessage>
{
private readonly IMapper _mapper;
// ... code that does stuff ...
public void DoThing(TMessage message)
{
// ... more code ...
var @event = _mapper.Map<IEvent>(message);
// Here I would expect @event to be a MyEvent instance if
// TMessage is MyMessage, for example
}
}
这给了我一个例外:
缺少类型映射配置或不支持的映射。
我尝试在.Include
语句中添加.IncludeBase
或CreateMap
,但结果相同。有没有办法实现我想要的,或者这不是一个支持的用例?
答案 0 :(得分:3)
对于这个简单的情况,你可以使用As。
CreateMap<MyMessage, IEvent>().As<MyEvent>();
鉴于IEvent是一个标记接口,您还需要具体的地图MyMessage =&gt; MyEvent。 如果您的实际案例更复杂,则需要包含。 docs。
答案 1 :(得分:-1)
我找到了实现我想要的方法:
configuration.CreateMap<MyMessage, MyEvent>();
configuration.CreateMap<MyMessage, IEvent>()
.ConstructUsing((m, c) => c.Mapper.Map<MyMessage, MyEvent>(m));
configuration.CreateMap<MyOtherMessage, MyOtherEvent>();
configuration.CreateMap<MyOtherMessage, IEvent>()
.ConstructUsing((m, c) => c.Mapper.Map<MyOtherMessage, MyOtherEvent>(m));
// etc. - will encapsulate in an extension method
通过注册这样的映射,AutoMapper根据TMessage
类型找到正确的映射器,并返回一个事件实例。就像我希望的那样简单!