c# - 每个派生类的 Web API 方法还是只有一种方法可以服务于所有类?

标签 c# api inheritance

我有几个派生类 BC 继承自同一基类 A:

public class A {}
public class B : A {}
public class C : A {}

我需要创建一个 HTTP POST API 方法来使用每个具体类。是使用一种接受基类的方法更好,还是为每个派生类创建单独的方法更好?

[Route("send/Base")]
[HttpPost]
public IHttpActionResult SendPricingLetter(A model)
{
    // do some type checking and perform logic    
}

我正在使用工厂进行类型检查并为每个类设置适当的字段,看起来它很快就会变得难以管理。

或者

[Route("send/ConcreteB")]
[HttpPost]
public IHttpActionResult SendSomeOther(B model)
{
    // No type checking required and perform logic     
}

[Route("send/ConcreteC")]
[HttpPost]
public IHttpActionResult SendStuff(C model)
{
    // No type checking required and perform logic    
}

最佳答案

即使您可能发布 BC,您的方法 SendPricingLetter 将始终收到 A 的实例。这与反序列化的工作方式有关。您“进行一些类型检查”的方法将不起作用,因为您始终必须处理 A 类型的对象。不会表明它们是否源自 AB 还是 C

我不确定您的要求是什么;然而,在 Web API 方法中,您考虑的是数据模型,而不是面向对象的继承原则。我个人非常喜欢遵循 ​​REST 原则,这会让你以面向领域的方式进行更多思考。

检查你的类建模是否正确。如果是这样,并且您确实需要将这些不同的对象传输到您的 API,那么您可以提供三种单独的方法,一种用于 A,一种用于 B,一种用于 >C,- 或者 - 您有一个调用并相应地处理 ABC,如下所示:

public class MyRequestModel
{
    public DomainModelType Type { get; set; }
    public A ToDomainObject()
    {
        switch (Type)
        {
            case DomainModelType.A:
                return new A();
            case DomainModelType.B:
                return new B();
            case DomainModelType.C:
                return new C();
            default:
                throw new InvalidOperationException();
        }
    }
}

[Route("Stuff")]
[HttpPost]
public IHttpActionResult Stuff(MyRequestModel requestModel)
{
    var myOriginalObject = requestModel.ToDomainObject();
    // do some type checking and perform logic
}

我个人总是会使用显式 API 调用(在您的例子中是三个),除非我有将它们放在一起的有效要求。

关于c# - 每个派生类的 Web API 方法还是只有一种方法可以服务于所有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952395/

相关文章:

c# - 无法使用 SmtpClient 发送邮件

ruby - 如何使用带有 Ruby 的 Sinatra gem 隐藏 API key

Grails GORM 继承最佳实践

swift - 继承自@objc协议(protocol)

c++ - 在 C++ 中类继承的情况下强制后期方法解析

c# - 如何从网站上的表格中检索数据?

c# - 如何用 SimpleLambdaExpression 中的另一个变量替换 lambda 参数的用法?

c# - 在属性窗口中更改时自定义属性不会保存

java - 请建议java邮件api

api - 如何将所有以美元平价计算的代币发送至 Binance API?