每个派生类的 Web API 方法,还是只有一个可以为所有人服务的方法?



我有几个派生类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    
}

您的方法SendPricingLetter将始终收到A的实例,即使您可能会发布BC。这与反序列化的工作方式有关。您"进行某种类型检查"的方法将不起作用,因为您将始终必须处理类型A的对象。没有迹象表明它们是否起源于ABC

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

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

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 调用(在您的情况下是三个),除非我有有效的要求将它们放在一起。

相关内容

最新更新