处理来自不同 (Web) 服务的相同对象
Handle same Object from different (Web)services
在我的项目中,我使用了 2 个 Web 服务(我们称它们为 servA
和 servB
),它们 return 相同类型的对象。
对象看起来如下:
public class Record
{
public String RecordName{ get; set; }
public List<RecordAttribute> RecordAttributes{ get; set; }
}
public class RecordAttribute
{
public String AttributeName{ get; set; }
public List<object> RecordAttributesValues{ get; set; }
}
我编写了一段通用代码来将那些 RecordAttributes 映射到本地对象类型。但我面临的问题是 I have to keep seperate functions for the results coming from servA Aand servB.
例如如下:
ServA
public List<T> mapServAResultToObject<T>(ServA.Record[] results)
{
....
mapServAAttributeToObject<T>(results.RecordAttributes)
....
}
Public T mapServBAttributesToObject<T>(ServA.RecordAttribute Attrs)
{ .... }
对于 servB
public List<T> mapServBResultToObject<T>(ServB.Record[] results)
{
....
mapServBAttributesToObject<T>(results.RecordAttributes)
....
}
Public T mapServBAttributesToObject<T>(ServB.RecordAttribute Attrs)
{ .... }
这些双重功能开始伤害我的眼睛了。
问题:
- 有没有办法解决这个问题,我可以只对 ServA 和 ServB 的结果使用一个函数
- 或者是否有一种性能高效的方法可以将这些结果转换为快速的本地对象?
而且这没有适应服务?
这是使用 AutoMapper 完成的映射示例。它可以将 ServA 和 ServB 对象映射到 ObjectType。您可以从 Nuget 获取 AutoMapper。
class Program
{
static void Main(string[] args)
{
var objectFromServiceA = new ServA_Record();
objectFromServiceA.RecordAttributes = new List<ServA_Record.ServA_RecordAttribute>();
objectFromServiceA.RecordName = "Test A";
objectFromServiceA.RecordAttributes.Add(new ServA_Record.ServA_RecordAttribute() { AttributeName = "Record Attr A", RecordAttributesValues = new List<object>() });
var objectFromServiceB = new ServB_Record();
objectFromServiceB.RecordAttributes = new List<ServB_Record.ServB_RecordAttribute>();
objectFromServiceB.RecordName = "Test B";
objectFromServiceB.RecordAttributes.Add(new ServB_Record.ServB_RecordAttribute() { AttributeName = "Record Attr B", RecordAttributesValues = new List<object>() });
var businessObject = new ObjectType();
Mapper.CreateMap<ServA_Record, ObjectType>();
Mapper.CreateMap<ServB_Record, ObjectType>();
Mapper.CreateMap<ServA_Record.ServA_RecordAttribute, ObjectType.ObjectTypeAttribute>();
Mapper.CreateMap<ServB_Record.ServB_RecordAttribute, ObjectType.ObjectTypeAttribute>();
businessObject = Mapper.Map<ServA_Record, ObjectType>(objectFromServiceA);
Console.WriteLine(businessObject.RecordName);
Console.WriteLine(businessObject.RecordAttributes[0].AttributeName);
businessObject = Mapper.Map<ServB_Record, ObjectType>(objectFromServiceB);
Console.WriteLine(businessObject.RecordName);
Console.WriteLine(businessObject.RecordAttributes[0].AttributeName);
Console.ReadKey();
}
}
public class ServA_Record
{
public String RecordName { get; set; }
public List<ServA_RecordAttribute> RecordAttributes { get; set; }
public class ServA_RecordAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}
public class ServB_Record
{
public String RecordName { get; set; }
public List<ServB_RecordAttribute> RecordAttributes { get; set; }
public class ServB_RecordAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}
public class ObjectType
{
public String RecordName { get; set; }
public List<ObjectTypeAttribute> RecordAttributes { get; set; }
public class ObjectTypeAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}
在我的项目中,我使用了 2 个 Web 服务(我们称它们为 servA
和 servB
),它们 return 相同类型的对象。
对象看起来如下:
public class Record
{
public String RecordName{ get; set; }
public List<RecordAttribute> RecordAttributes{ get; set; }
}
public class RecordAttribute
{
public String AttributeName{ get; set; }
public List<object> RecordAttributesValues{ get; set; }
}
我编写了一段通用代码来将那些 RecordAttributes 映射到本地对象类型。但我面临的问题是 I have to keep seperate functions for the results coming from servA Aand servB.
例如如下:
ServA
public List<T> mapServAResultToObject<T>(ServA.Record[] results)
{
....
mapServAAttributeToObject<T>(results.RecordAttributes)
....
}
Public T mapServBAttributesToObject<T>(ServA.RecordAttribute Attrs)
{ .... }
对于 servB
public List<T> mapServBResultToObject<T>(ServB.Record[] results)
{
....
mapServBAttributesToObject<T>(results.RecordAttributes)
....
}
Public T mapServBAttributesToObject<T>(ServB.RecordAttribute Attrs)
{ .... }
这些双重功能开始伤害我的眼睛了。 问题:
- 有没有办法解决这个问题,我可以只对 ServA 和 ServB 的结果使用一个函数
- 或者是否有一种性能高效的方法可以将这些结果转换为快速的本地对象?
而且这没有适应服务?
这是使用 AutoMapper 完成的映射示例。它可以将 ServA 和 ServB 对象映射到 ObjectType。您可以从 Nuget 获取 AutoMapper。
class Program
{
static void Main(string[] args)
{
var objectFromServiceA = new ServA_Record();
objectFromServiceA.RecordAttributes = new List<ServA_Record.ServA_RecordAttribute>();
objectFromServiceA.RecordName = "Test A";
objectFromServiceA.RecordAttributes.Add(new ServA_Record.ServA_RecordAttribute() { AttributeName = "Record Attr A", RecordAttributesValues = new List<object>() });
var objectFromServiceB = new ServB_Record();
objectFromServiceB.RecordAttributes = new List<ServB_Record.ServB_RecordAttribute>();
objectFromServiceB.RecordName = "Test B";
objectFromServiceB.RecordAttributes.Add(new ServB_Record.ServB_RecordAttribute() { AttributeName = "Record Attr B", RecordAttributesValues = new List<object>() });
var businessObject = new ObjectType();
Mapper.CreateMap<ServA_Record, ObjectType>();
Mapper.CreateMap<ServB_Record, ObjectType>();
Mapper.CreateMap<ServA_Record.ServA_RecordAttribute, ObjectType.ObjectTypeAttribute>();
Mapper.CreateMap<ServB_Record.ServB_RecordAttribute, ObjectType.ObjectTypeAttribute>();
businessObject = Mapper.Map<ServA_Record, ObjectType>(objectFromServiceA);
Console.WriteLine(businessObject.RecordName);
Console.WriteLine(businessObject.RecordAttributes[0].AttributeName);
businessObject = Mapper.Map<ServB_Record, ObjectType>(objectFromServiceB);
Console.WriteLine(businessObject.RecordName);
Console.WriteLine(businessObject.RecordAttributes[0].AttributeName);
Console.ReadKey();
}
}
public class ServA_Record
{
public String RecordName { get; set; }
public List<ServA_RecordAttribute> RecordAttributes { get; set; }
public class ServA_RecordAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}
public class ServB_Record
{
public String RecordName { get; set; }
public List<ServB_RecordAttribute> RecordAttributes { get; set; }
public class ServB_RecordAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}
public class ObjectType
{
public String RecordName { get; set; }
public List<ObjectTypeAttribute> RecordAttributes { get; set; }
public class ObjectTypeAttribute
{
public String AttributeName { get; set; }
public List<object> RecordAttributesValues { get; set; }
}
}