【发布时间】:2017-08-11 11:48:29
【问题描述】:
我正在尝试在我的应用程序中实现一些横切关注点,它使用 AutoMapper 在不同的 DTO/消息对象之间进行映射。
假设我有这个:
configuration.Map<MyMessage, MyEvent>()。 MyEvent 实现 IEvent(这是一个没有属性的标记接口)。有没有办法让 AutoMapper 将MyMessage 映射到IEvent,并让它推断“哦,我有一个映射MyMessage 到MyEvent,而MyEvent 实现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 语句,但结果相同。有什么方法可以实现我想要的,或者这根本不是一个受支持的用例?
【问题讨论】:
-
出于兴趣,会不会让你写
configuration.Map<MyMessage, IEvent>();? -
不,
IEvent只是一个标记接口,没有可以映射到的属性。如果我尝试映射到它,AutoMapper 只会生成一个Proxy<>实例,我不能使用它,因为我想在映射后序列化事件。 -
好的。你说 - “它推断“哦,我有一个映射 MyMessage 到 MyEvent,而 MyEvent 实现了 IEvent”。我原以为,当你有多个实现 IEvent 的映射时,这个问题就会出现,例如 @ 987654337@ 其中 MyEvent2 也实现了 IEvent。因此,我怀疑该工具不会设置为执行此操作,因为在我刚刚描述的情况下,它不知道映射到什么。这只是我最好的猜测为什么它不会不行。
-
但是由于您希望@event 应该是一个 MyEvent 实例,所以不清楚为什么不能直接映射到它?例如
var @event = _mapper.Map<MyEvent>(message);。也许我在您对场景的解释中遗漏了一些关于您为什么不能/不想这样做的内容。 -
@ADyson - 这只是一个假设,但我想他可能有多个实现相同接口的类,并且想要创建一个始终返回一个接口的通用方法,该接口以后可以转换为一个具体的类。
标签: c# automapper