【问题标题】:How do I implement Post([FromBody] IMessage msg) in my .Net Core 2.1 web api Controller?如何在我的 .Net Core 2.1 web api 控制器中实现 Post([FromBody] IMessage msg)?
【发布时间】:2018-07-31 16:30:37
【问题描述】:

发送实现接口 IMessage 的简单 JSON 结构时出现以下异常:

无法创建 TestService2.IMessage 类型的实例。类型是接口或抽象类,不能实例化。路径“Id”,第 2 行,位置 7。

【问题讨论】:

  • 默认情况下,动作参数必须是可以由模型绑定器初始化的具体类。只有自定义模型绑定器才能用于实现您想要做的事情。
  • 我的问题是为什么要使用 am 接口作为模型参数?
  • @Nkosi 好问题。我不知道。我正在执行规范。
  • 但我建议使用接口作为操作参数。麻烦多于其价值。通过它的实现,这应该是一个 POCO

标签: asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

我绝对同意使用类是要走的路!

但是,如果由于某些晦涩/愚蠢的原因,您必须使用像我这样的接口,有一种简单的方法可以将其映射到 JSON 类。

在 Startup Method 中,定义接口的 Contracts:

services.AddMvc()
           .AddJsonOptions(o => { o.SerializerSettings.ContractResolver.ResolveContract(typeof(IMessage)).Converter = new MyJsonConverter<IMessage, Message>();})

其中IMessage是说接口,而MyJsonConverter是从JsonConverter派生的,例如:

public class MyJsonConverter<Tin, Tout> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        //Your logic here
        return (objectType == typeof(Tin) );
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        //deserializing from the implementation Class
        return serializer.Deserialize<Tout>(reader);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //use standard serialization
        serializer.Serialize(writer, value);
    }
}

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2018-11-06
    • 1970-01-01
    • 2018-11-16
    • 2019-02-19
    • 2018-01-29
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多