【问题标题】:How to use same properties for separate API requests如何对不同的 API 请求使用相同的属性
【发布时间】:2021-12-20 13:13:38
【问题描述】:

我有以下两种 API 方法:

[HttpPost]
public ActionResult<TransactionReadDto> TransactionGroup(TransactionGroup transactionGroup)
{
    // some code goes here
}

[HttpPost]
public ActionResult<TransactionReadDto> TransactionHistory(TransactionHistory transactionHistory)
{
    // some code goes here
}

以及上面的代码TransactionGroupTransactionHistory类如下:

public class TransactionGroup
{
    public string Name { get; set; }
    public string Publisher { get; set; }
    public string Cost { get; set; }
}

public class TransactionHistory
{
    public string Name { get; set; }
    public string Publisher { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
}

您可以看到这两个类对于NamePublisher 具有相同的属性(它具有比这两个更多的相同属性,这仅用于示例)。我的问题:有没有最好的方法来处理这个而不在 API 请求类中使用相同的属性?我可以使用继承吗?

如果是,有什么方法可以做到这一点?我的意思是我可以将相同的属性放入某个父类并继承让TransactionGroupTransactionHistory 类从该基类继承吗?这是一个好方法吗?

【问题讨论】:

  • 是的,如果这两个属性的含义相同,这是一个很好的方法
  • 我只想将两个类合并为一个,或者保持原样。由于 2 个字符串属性的差异,没有人创建新类。

标签: c# oop inheritance asp.net-core-webapi


【解决方案1】:

一般情况下,不要这样做。

您会认为您实际上是通过在此处实现继承或组合来删除冗余代码。 但是减少代码量的代价是你永久地耦合了两个 API 请求。将来您可能希望更改其中一种 API 方法,但不更改另一种。如果您将这两者(甚至更多)结合起来,这将更加困难。

此外,您不会通过共享代码真正获得任何可读性。相反,它会更难阅读,因为并非TransactionHistory 的所有属性都可以在其类中找到。

如果你发现代码重复太多了,你会更喜欢这样的组合:

public class TransactionHistory
{
  public CommonTransactionData common { get; set; }
  public string StartDate { get; set; }
  public string EndDate { get; set; }
}

在这种特殊情况下,您也可以认为它使用继承是干净的,但通常我们遵循composition over inheritance principle

编辑:错过了一个属性名称

【讨论】:

  • @derpirscher 如果类的层次结构清晰且有意,那么继承就可以了。这就是我在回复的最后一段中所写的。但这里我们谈论两个代表 API 参数的类。如果两者都服务于相同的目的并满足 Liskov 替换原则,则继承是可以的。但似乎这个问题只针对重用代码。
  • 我认为 “一般不这样做” 这样的答案在这里不合适。是的,组合优于继承的原则在很多情况下都是有效的。但这并不意味着您根本不应该使用继承。在有明确的类层次结构(例如vehicle -&gt; car)共享公共属性和功能的情况下,继承仍然是要走的路......
  • 我并不是说,继承在这里是合适的,因为我没有看到任何层次结构证明它是合理的。但是,对我来说,以“通常不这样做”开始你的回答给人的印象是,你暗示根本不使用继承。
  • @derpirscher 也许这对我来说是一个语言障碍。我的真正意思是,如果我问自己“我应该使用继承来重用代码吗?”,答案几乎总是“不”。问题是“你可以看到这两个类具有相同的属性 [...]。我的问题:有没有最好的方法来处理这个问题而不在 API 请求类中使用相同的属性?我可以使用继承吗?”
【解决方案2】:

TransactionGroupTransactionHistory 有什么关系?一个是另一个的子类型(例如Vehicle -&gt; Car)还是它们只是具有相同名称的属性。 CountryPerson 都有 Name,但这并不意味着您应该让 PersonCountry 继承,反之亦然。

特别是,如果我查看您的类,它们都具有专有属性(即Cost 仅存在于TransactionGroup 中,而StartDate 仅存在于TransactionHistory 中)。但是如果你让一个继承另一个,这意味着另一个也将拥有所有属性。 Group 拥有 StartDate 是否有意义,或者 History 拥有 Cost 是否有意义?如果不是,继承不是正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2018-07-14
    • 2019-05-07
    • 2019-05-28
    • 2019-01-20
    相关资源
    最近更新 更多