对象变压器/适配器

时间:2015-02-17 18:50:04

标签: c# design-patterns

在C#/ .NET中,映射数据字段(某些任意对象)的最佳方法是从一个RESTful端点/系统中获取,然后是'将其发布到另一个RESTful端点/系统(已知)。这是一些示例代码...... 编辑 - 在这段代码中,我正在模拟一个Source对象。但实际上,我试图以这样的方式写这个,它会是动态的。我可以设计的唯一结论是将相关性放在用户上以提供一个字段映射文件(json或xml),它将源对象的数据字段(因为它们可能知道自己的系统最好)映射到众所周知的目的地系统。 字段映射本质上是一个键值对,目标字段用作'键'而source-field将是'值'。编辑 - 我添加了'适配器'标题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Reflection;
using NSubstitute;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
using System.Diagnostics;

namespace ConsAppJsonNet
{
    class Program
    {
        static void Main(string[] args)
       {
        //GET SOURCE OBJECT
        dynamic sourceObjdyn = GetSourceObj();

        //GET FIELD MAPPINGS
        Dictionary<string, string> fieldMappings = GetFieldMappings();

        //NEW UP DESTINATION OBJECT
        DestinationObject destinationObject = new DestinationObject();

        foreach (var fieldMapping in fieldMappings)
        {
            foreach (var prop in destinationObject.GetType().GetProperties())
            {
                if (prop.Name == fieldMapping.Key)
                {
                    prop.SetValue(destinationObject,    sourceObjdyn.GetType().GetProperty(fieldMapping.Value).GetValue(sourceObjdyn));                        
                    break;
                }
            }
        }

        Console.WriteLine(destinationObject);
        //Console.ReadKey();
    }

    static Dictionary<string,string> GetFieldMappings()
    {
        string jsonFieldMappings = @"       
            {
                ""SSN"":""ssn"",      
                ""GEN_ID"":""sysid"",      
                ""BIRTH_DATE"":""dob""      
            }";

        //DESERALIZE FIELD-MAPPINGS
        Dictionary<string, string> fieldMappings =    JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonFieldMappings);

        return fieldMappings;
    }

    private static dynamic GetSourceObj()
    {
        //MOCK A SOURCE OBJECT
        var sourceObj = Substitute.For<ISourceObject>();
        sourceObj.dob.Returns("10/10/20112");
        sourceObj.ssn.Returns("555-66-5555");
        sourceObj.sysid.Returns("9876");

        return sourceObj;
    }

}//end program

public class DestinationObject
{
    //ctor
    public DestinationObject()
    { }

    public string SSN { get; set; }
    public string GEN_ID { get; set; }
    public string BIRTH_DATE { get; set; }

    public override string ToString()
    {
        return string.Format("BIRTH_DATE = {0},\nSSN = {1},\nGEN_ID = {2}",  this.BIRTH_DATE, this.SSN, this.GEN_ID);
    }

}//end class

public interface ISourceObject
{
     string ssn { get; set; }
     string sysid { get; set; }
     string dob { get; set; }
}

}//end namespace

1 个答案:

答案 0 :(得分:2)

除非您使用某些自动映射库,否则最好的方法是简单地编写一个函数:

public SecondApiObject ConvertFirstApiObject(FirstApiObject data)
{
     // return a new object with the fields from the first one
}

如果您有IEnumerable个,可以使用Select来调用转换操作:

listOfFirstApiObjects.Select(ConvertFirstApiObject);

如果总是一个IEnumerable,你也可以将转换内联为Select参数中的lambda。