从AutoMapper界面推断目标类型

问题描述 投票:2回答:2

我正在尝试在我的应用程序中实现一些横切关注点,它使用AutoMapper在不同的DTO /消息对象之间进行映射。

说我有这个:configuration.Map<MyMessage, MyEvent>()MyEvent实现了IEvent(这是一个没有属性的标记接口)。有没有办法要求AutoMapper将MyMessage映射到IEvent,并让它推断“哦,我有MyMessage映射到MyEventMyEvent实现IEvent”?

这个(无效)示例显示了我想要实现的目标:

// 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语句中,但结果相同。有没有办法实现我想要的,或者这不是一个支持的用例?

c# automapper
2个回答
3
投票

对于这个简单的情况,您可以使用As。

CreateMap<MyMessage, IEvent>().As<MyEvent>();

鉴于IEvent是一个标记接口,您还需要具体的映射MyMessage => MyEvent。如果您的实际案例更复杂,则需要包含。 docs


-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类型找到正确的映射器,并返回一个事件实例。就像我希望的一样简单!

© www.soinside.com 2019 - 2024. All rights reserved.