处理来自第三方API的设计糟糕的模型

时间:2018-03-23 15:20:16

标签: c#

在我工作的公司里,我被迫使用来自我无法访问的第三方API的设计糟糕的模型:

class Player
{
    object Id;
    object Name;
}

每次我使用这些属性时,我都必须将它们转换为特定类型。

var name = player.Name.ToString();
var id = (int)player.Id;

我必须在数据库中查找类型是什么。

我正在考虑创建完全相同的类,并使用类似AutoMapper的东西每次将它映射到我自己的类型,并创建一些代理/包装类而不是原始类。

任何解决方案?

3 个答案:

答案 0 :(得分:2)

There are two ways I would do this. Either using an extension method or by simply creating your new class with a static Convert method that take the badly designed class as a parameter.

Example 1:

namespace ExcellentDesignedClasses
{
    public class NewPlayerClass
    {
        public NewPlayerClass(int id, string name)
        {
            Id = id;
            Name = name;
        }

        public static NewPlayerClass Convert(Player player)
        {
            return new NewPlayerClass((int)player.Id, (string)player.Name);
        }

        public int Id { get; set; }
        public string Name { get; set; }
    }
}

Example 2: using Extension Methods

namespace ExcellentDesignedClasses
{
    public class NewPlayerClass
    {
        public NewPlayerClass(int id, string name)
        {
            Id = id;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

namespace ExcellentDesignedClasses.Extensions
{
    public static class Extensions
    {
        public static NewPlayerClass ConvertToNew(this Player player)
        {
            return new NewPlayerClass((int)player.Id, (string)player.Name);
        }
    }
}

namespace MyProgram
{
    using ExcellentDesignedClasses.Extensions;
    public class Main
    {
        public void DoSomething()
        {
            var oldClassStructure = new Player();
            var newClassStructure = oldClassStructure.ConvertToNew();
        }
    }
}

答案 1 :(得分:1)

您可以做的一件事是为您关注的属性创建extension method。好处是前期工作量较少:只需在发现自己需要进行强制转换时创建扩展方法。您不必编写任何完整的类或映射代码。缺点是每次需要强类型属性时都必须调用方法。

例如:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static string GetName(this Player p) 
        { 
            return p.Name?.ToString(); 
        }

        public static int GetId(this Player p) 
        { 
            return Convert.ToInt32(p.Id);
        }
    }   
}

然后你的代码看起来像:

string name = player.GetName();
int id = player.GetId();

答案 2 :(得分:1)

我曾为这样的公司工作过。如果你知道.Net,那么他们仍然会在面试中问你,而你发现他们的意思是他们需要维护的旧版Server 2003上的版本1.1。他们是Raisin Bran的烧焦葡萄干。

使用继承来重新定义craptastic模型。这就是我通常如何解决它。然后,我从我的对象返回我想要的东西,并停止使用我基于它的类。

前:

    class Player
    {
        public object Id;
        public object Name; 

    }

    class UserPlayer : Player
    {
        public new int Id
        {
            get
            {
                return Convert.ToInt32(base.Id);
            }
            set
            {
                base.Id = value;
            }

        }
        public new string Name
        {
            get
            {
                return base.Name.ToString();
            }
            set
            {
                base.Name = value;
            }
        }
   }

在做上述操作时获得亚军的想法会让你陷入困境,因为编写代码的人仍然为公司工作并且有朋友,或者更糟糕的是,你的老板:使用静态类来处理你想要的东西。

        public static class ProcessPlayers
        {
            public static int ID(Player p)
            {
                return Convert.ToInt32(p.Id);
            }

            public static string Name(Player p)
            {
                return p.Name.ToString();
            }
        }

您也可以通过将Player作为属性来创建每个环绕Player的新对象,但继承该对象并覆盖其属性可能是更好的选择。