【问题标题】:Generic mapping in AutomapperAutomapper 中的通用映射
【发布时间】:2014-10-22 13:59:59
【问题描述】:

我尝试使用 automapper 将数据协定转换为客户端对象,反之亦然。为了减少代码行并使其更简单,我想动态创建映射。 假设我正在调用 5 个不同的服务,每个服务将返回相同的对象,如 Employee,但数据会有所不同(如果我需要来自 Microsoft 的员工信息,我将调用 Microsoft 服务,或者如果我想要 IBM 员工详细信息,我将调用 IBM 服务,依此类推)。

我的对象如下所示..

Public class Employee
{
Public string Id{get;set;}
Public string Division{get;set;}
Public PersonDetails person{get;set;}
}
Public class PersonDetails
{
Public string Name{get;set;}
Public string Email{get;set;}
Public string contact{get;set;}
}

使用 Automapper 我可以在下面写一些东西..

 Mapper.CreateMap<Service1. PersonDetails, PersonDetails >();
   Mapper.CreateMap<Service1.Employee, Employee>()
        .ForMember(DEST=>DEST. PersonDetails,M=>M.MapFrom(Q=>Q. PersonDetails));
   Mapper.CreateMap<Service2. PersonDetails, PersonDetails >();
   Mapper.CreateMap<Service2.Employee, Employee>()
         .ForMember(DEST=>DEST.PersonDetails,M=>M.MapFrom(Q=>Q. PersonDetails));

但是由于我调用了 5 个不同的服务,所以我必须写 5 次相同的类似逻辑。

有什么方法可以动态地做到这一点,这意味着我想在运行时告诉 Automapper 源..

请指教!!!

【问题讨论】:

  • 服务是否相同(不仅仅是相同)?如果是这种情况,您应该能够为所有这些使用完全相同的DataContract 类。另一方面,如果它们只是相似,我看不出 Automapper 将如何帮助您自动解决差异。
  • @JeroenMostert 服务不同,因此每个数据合同将来自不同的命名空间。我认为动态自动映射器可能会解决问题,但不确定它有多准确..
  • 我的意思是——服务在结构上是不同的(也就是说,它们的请求是完全不同的)还是除了它们的端点地址和自动-生成的命名空间?因为在你上面的例子中,没有明显的区别。
  • 哦..除了端点地址和自动生成的命名空间外,它们是相同的..
  • 在这种情况下,您可以添加一次服务引用并为所有服务使用相同的类。创建服务实例时,只需在构造函数中指定一个新端点即可。

标签: c# wcf automapper dto


【解决方案1】:

看起来您应该能够从接口而不是服务本身进行映射。

public interface IEmployeeServiceResponce
{
    Employee {get;}
    PersonDetails{get;}
}

然后让每个服务实现该接口。

这个articular 可以更清楚地表达我的建议

如果返回与接口不同,那么我建议实现适配器模式以统一它们。

【讨论】:

  • :谢谢您的回复。您的意思是“然后让每个服务实现该接口。”。如果服务是外部的,我们如何进行更改服务实现..您能否详细说明一下您正在谈论的适配器模式..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2022-01-26
相关资源
最近更新 更多