2017-08-30 46 views
1

我有几个派生类BC从相同的基类继承A的:每个派生类的Web API方法还是只有一种可以提供全部服务的方法?

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  
} 
+0

我不知道你的示例代码是否太抽象。 “SendPricingLetter”方法将始终为您提供'A'对象,而不是'B'或'C'。你会做什么样的“某种类型检查”? –

+0

我可以发布任何继承自A的对象。与任何需要基类作为参数的方法一样。然后我必须进行一些检查来找出派生类。 –

+0

请您更新您的问题并解释此测试应如何工作?你得到一个类型为'A'的对象,但是没有任何迹象表明最初发布的对象是'B'还是'C'。这是一个网络电话。由于序列化,您丢失了继承信息。你收到的是一个序列化的'B'或'C';然而,由于反序列化,你作为参数得到的是一个普通的'A'。 –

回答

1

你的方法SendPricingLetter总会收到A一个实例,即使你可能发布BC。这与反序列化的工作方式有关。您的“做某种类型检查”的方法将不起作用,因为您将始终需要处理类型为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调用去(在你的情况下为三个),除非我有一个有效的要求,让他们在一起。

+1

我正在使用显式的API调用。刚刚意识到序列化现象:(但是,如果我期望一个对象并将其转换为JObject,那么它将仍然包含所有信息,并且可以投射到具体的类。它只会增加复杂性。您的方式很聪明,但我会坚持使用明确的终点。 –

相关问题