gpt4 book ai didi

c# - 关于类型映射的最佳实践

转载 作者:行者123 更新时间:2023-11-30 16:51:47 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

6年前关闭。




Improve this question




我想问一些关于映射类型和在 C# 中使用扩展方法的最佳实践的问题。我知道这个话题在过去几年中已经被多次讨论过,但我已经阅读了很多帖子,仍然有疑问。

我遇到的问题是使用“转换”功能扩展我拥有的类。假设我有一个类“Person”,它代表一个将被某些逻辑使用的对象。我还有一个类“Customer”,它表示来自外部 API 的响应(实际上会有多个 API,因此我需要将每个 API 的响应映射到通用类型:Person)。我可以访问这两个类的源代码,理论上可以在那里实现我自己的方法。我需要将客户转换为个人,以便将其保存到数据库中。该项目不使用任何自动映射器。

我有 4 种可能的解决方案:

  • Consumer 类中的 .ToPerson() 方法。这很简单,但对我来说似乎打破了单一责任模式,特别是 Consumer 类也映射到其他类(一些由另一个外部 API 需要),因此它需要包含多个映射方法。
  • 以 Consumer 作为参数的 Person 类中的映射构造函数。也很容易,而且似乎也打破了单一责任模式。我需要有多个映射构造函数(因为会有来自另一个 API 的类,提供与 Consumer 相同的数据,但格式略有不同)
  • 带有扩展方法的转换器类。这样我可以为 Consumer 类编写 .ToPerson() 方法,并且当使用它自己的 NewConsumer 类引入另一个 API 时,我可以编写另一个扩展方法并将其全部保存在同一个文件中。我听说过一种观点,即扩展方法通常是邪恶的,只有在绝对必要的情况下才应该使用,这就是阻碍我的原因。否则我喜欢这个解决方案
  • 转换器/映射器类。我创建了单独的类来处理转换并实现将源类实例作为参数并返回目标类实例的方法。

  • 总而言之,我的问题可以减少到问题的数量(所有在我上面描述的上下文中):
  • 将转换方法放入(POCO?)对象(如 Consumer 类中的 .ToPerson() 方法)是否考虑破坏单一责任模式?
  • 在(类似 DTO 的)类中使用转换构造函数是否考虑打破单一责任模式?特别是如果这样的类可以从多种源类型转换,那么需要多个转换构造函数吗?
  • 在访问原始类源代码的同时使用扩展方法是否被认为是不好的做法?这种行为可以用作分离逻辑的可行模式还是反模式?
  • 最佳答案

    由于这比较主观,所以请不要标记为答案,每个人都有自己的方法,没有客观上是最好的或比别人更好的实现。

    1 和 2 介绍了耦合。我不会去找他们。

    对于第 3 点,扩展方法本身打破了许多规则(至少它们打破了我编程自我书中的规则)。那里有很多担忧。

    当您在 System.String 类型的 IsValidEMail() 之类的实例上创建扩展方法时,会创建一个接受字符串实例作为参数的静态方法。除非您反编译输出程序集,否则您当然不会看到这一点。

    public static IsValidEMail(string instance);

    然后,以下代码块可以完美运行,而不是抛出空指针异常:
    string nullEMail = null;
    bool isValidEMail = nullEMail.IsValidEMail();

    让我不喜欢扩展方法的另一件事是 Linq。

    Linq 包含大量扩展方法。当开发人员(尤其是初级人员)在 IEnumerable 实例上看到 Count() 方法时,他们可能会毫不谨慎地使用它。他们会知道这种方法在内部做什么吗?不会。他们只会认为它相当于具体列表或字典对象的 Count 属性,并会在另一个循环中调用它,而您作为高级程序员将通过整夜分析进程转储来解决生产性能问题长。

    所以我对 Linq 的简短口号的赌注是:
    Code Less, Spend More (on cpu and ram of course)

    这更像是一个 Linq 问题,而不是扩展方法的问题,但无论如何,如果 IEnumerable 本来应该有一个 Count() 方法或字符串一个 IsValidEMail 方法,那么架构师会首先将它们放在那里,不是吗? ?

    扩展方法的另一件事。

    假设你有一个代码块,编译器给出了一个缺少方法的错误,它实际上是一个扩展方法,它在哪个程序集和哪个类中谁知道。到目前为止,Visual Studio 本身也无法告诉您。

    无论如何。

    我建议 4。实际上,这被称为 Mediator Pattern

    我什至建议为此目的使用可重复使用的映射器,它甚至不知道您的任何类,并且仍然能够将一个映射到另一个。

    其中之一: http://automapper.codeplex.com/

    关于c# - 关于类型映射的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33498215/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com