不同数据结构的数据协定
本文关键字:数据 数据结构 | 更新日期: 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; }
}