DataContract用于不同的数据结构

时间:2014-12-24 15:54:25

标签: c# datamapper datacontractserializer

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

[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; }
}

我认为有更好的方法。有人知道吗?

3 个答案:

答案 0 :(得分:1)

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

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

以下是使用automapper演示的示例。它使用了一些代码,但从长远来看,在数据类型之间具有声明性映射的大型项目更清晰,更容易调试。

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);
   }
}

答案 1 :(得分:0)

我认为您实际上不应该为两个不同的数据源使用相同的合同。但是如果你需要交替使用它们,你就有一些选择,比如让它们都从公共接口继承

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

动力学

dynamic myMapper = new Mapper1();

Console.WriteLine(myMapper.Id);

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

答案 2 :(得分:0)

我认为这是目前最好的设计:

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; }
}