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

  • 本文关键字:模型 处理 第三方 API c#
  • 更新时间 :
  • 英文 :


在我工作的公司里,我被迫使用来自第三方API的设计不佳的模型,

我无法访问:
class Player
{
    object Id;
    object Name;
}

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

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

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

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

有什么解决办法吗?

我有两种方法可以做到这一点。使用扩展方法,或者简单地使用静态 Convert 方法创建新类,该方法将设计不佳的类作为参数。

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

示例 2:使用扩展方法

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

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

例如:

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

我曾在这样的公司工作过。 他们是那种在面试中仍然问你是否知道.Net的人,你发现他们的意思是他们需要维护的Server 2003旧实例上的1.1版本。 它们是葡萄干麸皮中烧焦的葡萄干。

使用继承来重新定义废话模型。 这就是我通常修复它的方式。 然后,我从对象中返回我想要的内容,并停止使用我基于它们的类。

前任:

    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,但继承对象并重写其属性可能是更好的选择。

最新更新