Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每个派生类使用WebAPI方法还是只有一个方法可以服务所有派生类?_C#_Api_Inheritance - Fatal编程技术网

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
的实例,即使您可以发布A
B
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
}