C# 每个派生类使用WebAPI方法还是只有一个方法可以服务所有派生类?
我有两个派生类C# 每个派生类使用WebAPI方法还是只有一个方法可以服务所有派生类?,c#,api,inheritance,C#,Api,Inheritance,我有两个派生类B和C继承自同一基类a: public class A {} public class B : A {} public class C : A {} 我需要创建一个HTTPPOSTAPI方法来使用每个具体类。最好有一个接受基类的方法,还是为每个派生类创建单独的方法 [Route("send/Base")] [HttpPost] public IHttpActionResult SendPricingLetter(A model) { // do some type che
B
和C
继承自同一基类a
:
public class A {}
public class B : A {}
public class C : A {}
我需要创建一个HTTPPOSTAPI方法来使用每个具体类。最好有一个接受基类的方法,还是为每个派生类创建单独的方法
[Route("send/Base")]
[HttpPost]
public IHttpActionResult SendPricingLetter(A model)
{
// do some type checking and perform logic
}
我使用工厂进行类型检查,并为每个类设置适当的字段,看起来它很快就会变得不可管理
或
您的方法
SendPricingLetter
将始终收到A
的实例,即使您可以发布AB
或C
。这与反序列化的工作方式有关。“执行一些类型检查”的方法将不起作用,因为您必须始终处理A
类型的对象。不会显示它们是来自A
、B
还是C
我不确定你的要求是什么;然而,在WebAPI方法中,您考虑的是数据模型,而不是面向对象的继承原则。我个人非常喜欢遵循REST原则,这会让你以面向领域的方式进行思考
检查您的类建模是否正确。如果是这样,并且如果您确实需要将这些不同的对象传输到您的API,那么您可以提供三种不同的方法,一种用于A
,一种用于B
,另一种用于C
,-或者-您有一个单独的调用并相应地处理A
,B
,以及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调用(在您的情况下是三个),除非我有一个有效的要求将它们放在一起。我想知道您的示例代码是否太抽象了。方法
SendPricingLetter
将始终为您获取A
对象,而不是B
或C
。你会做什么样的“类型检查”呢?我可以发布从A.继承的任何对象,就像任何希望基类作为参数的方法一样。然后我必须进行某种检查以找出派生类。请您更新您的问题并解释此测试应该如何工作,好吗?您将获得一个A
类型的对象,而不显示最初发布的对象是B
还是C
。这是一个网络电话。由于序列化,您将丢失继承信息。您收到的是一个序列化的B
或C
;但是,由于反序列化,您作为参数得到的是一个普通的a
。我还没有在web调用中尝试过。但对于方法来说,它确实有效。那么,尝试Web方法,您会感到惊讶。我将发布一个答案:-)我在使用显式API调用。刚刚意识到序列化现象:(.但是,如果我期望一个对象并强制转换为JObject,那么它仍然会包含所有信息,并且可以强制转换为具体的类。这只会增加复杂性。你的方法很聪明,但我认为我会坚持显式端点。
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
}