不同数据结构的数据协定

本文关键字:数据 数据结构 | 更新日期: 2023-09-27 18:35:17

>我有两个数据提供者,它们有不同的数据结构。我必须将它的结构映射到我自己身上。我使用以下代码来实现目的:

[DataContract]
class Mapper1
{
    [DataMember(Name="DataID")]
    public int id { get; set; }
    [DataMember(Name = "Time")]
    public DateTime d_time { get; set; }
}
class Mapper2
{
    [DataMember(Name = "ID")]
    public int id { get; set; }
    [DataMember(Name = "DATE")]
    public DateTime d_time { get; set; }
}

我认为有更好的方法可以做到这一点。有人知道吗?

不同数据结构的数据协定

在处理不同的数据源时,在结构上进行分离通常是一个好主意。 这将有助于在编码时隔离软件不同区域的问题。 简而言之,您可能希望为映射器提供更好的命名约定,并可能通过命名空间分隔它们,以帮助在代码中区分它们。

使用自动映射器还有助于在数据提供程序之间创建映射代码。 这样,您可以专注于适合每个提供程序的域语言。

下面是一个演示如何使用自动映射器的示例。 它使用了一些代码,但从长远来看,对于具有数据类型之间的声明性映射的大型项目来说,它更干净,更容易调试。

namespace Provider1
{
   [DataContract]
   public class Data
   {
      [DataMember]
      public int DataID { get; set; }
      [DataMember]
      public DateTime Time { get; set; }
   }
}
namespace Provider2
{
   [DataContract]
   public class Data
   {
      [DataMember]
      public int ID { get; set; }
      [DataMember]
      public DateTime DATE { get; set; }
   }
}
namespace Internal
{
   public class Data
   {
      public int id { get; set; }
      public DateTime d_time { get; set; }
   }
} 
public static class Configuration
{
   public static void InitMappers()
   {
      AutoMapper.Mapper.CreateMap<Internal.Data, Provider1.Data>()
         .ForMember(x=> x.DataID, opt=> opt.MapFrom(src=> src.id))
         .ForMember(x=> x.Time, opt=> opt.MapFrom(src => src.d_time)); 
     AutoMapper.Mapper.CreateMap<Internal.Data, Provider2.Data> ()
        .ForMember (x => x.ID, opt => opt.MapFrom (src => src.id))
        .ForMember (x => x.DATE, opt => opt.MapFrom (src => src.d_time));
   }
}
public class TestExample
{
   public void Test()
   {
      var src = new Internal.Data ();
      var dest = AutoMapper.Mapper.Map<Provider1.Data> (src);
      var dest2 = AutoMapper.Mapper.Map<Provider2.Data> (dest);
   }
}

我认为您实际上不应该对两个不同的数据源使用相同的合同工作。但是,如果您需要互换使用它们,则可以选择,例如使它们都从通用接口继承。

interface
{
    int Id {get; set;}
    DateTime Updated {get; set;}
}

动力学

dynamic myMapper = new Mapper1();
Console.WriteLine(myMapper.Id);

或者在我看来最好的选择是使用AutoMapper或类似工具将它们映射到通用模型

我认为这是

目前最好的设计:

public interface MyDataStructure
{
    public int id { get; set; }
    public DateTime d_time { get; set; }
}
[DataContract]
class Mapper1:MyDataStructure
{
    [DataMember(Name="DataID")]
    public int id { get; set; }
    [DataMember(Name = "Time")]
    public DateTime d_time { get; set; }
}
class Mapper2:MyDataStructure
{
    [DataMember(Name = "ID")]
    public int id { get; set; }
    [DataMember(Name = "DATE")]
    public DateTime d_time { get; set; }
}