我有两个数据提供者,他们有不同的数据结构。我必须把它的结构映射到我自己。 我使用以下代码来实现目标:
[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; }
}
我认为有更好的方法。有人知道吗?
答案 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; }
}