【发布时间】: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