我正在重构一个分析API,该API需要允许客户端将事件作为HTTP GET请求发送,其“命中”数据编码在URL的 QueryString参数中。
我的API的工作是接收这些事件,然后将“ valid” 事件放置到系统另一部分的队列中进行处理。
某些匹配具有相同的形状。唯一使它们与众不同的是type
参数的值,所有事件都必须具有最小值。
我遇到的问题是基于Hit类型,我希望能够假定给我的每个字段的类型,这需要模型绑定。当然。目前,在检查type
的值之后,我只能找出要针对哪个模型进行验证-这可能会使API过度"stringly typed"
示例路线为:
获取https://my.anonymousanalytics.net/capture?type=startAction&amount=300&so_rep=true
因此,我的命中将是:
{
type: "startAction",
amount: 300,
so_rep: true
}
假设可以绑定到模型StackOverflowStartHitModel
class StackOverflowStartHitModel {
public string type { get; } // Q: Could I force the value of this to be "startAction"?
? public int amount { get; }
public boolean so_rep { get; }
}
我为什么在这里问这个?好吧,我通常是一名JavaScript开发人员,但是通常我会寻求C#智慧的每个人都不会患上流感。
我已经尝试过使用[FromQuery]
属性修饰符,但是我担心的是,对于形状完全相同的匹配,我可能无法分辨是startAction
还是{例如endAction
。
答案 0 :(得分:0)
您将需要某种验证引擎,但不要将其与UI模型验证混为一谈。听起来您确实有一个带有许多有效状态的模型,这实际上是业务逻辑。
您的模型如下:
public class StackOverflowModel
{
public string type { get; set;}
public int amount { get; set; }
public bool so_rep { get; set;}
}
type 字段的值无关紧要,也不需要对其进行硬编码,它会照原样捕获,然后可以针对有效状态进行检查。
我可以想到很多方法。
一个选择是创建一个有效规则(状态)的列表,然后简单地检查您的输入模型是否与它们中的任何一个匹配。一种实现类似方法的方法可能是使用类似FluentValidation的库。您可以在此处查看示例:Validation Rules and Business Rules in MVC
另一种选择是使用某种模式匹配技术,例如:https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching
无论使用哪种选项,请确保将验证内容放在单独的类中,甚至可能放在单独的项目中。然后,您可以为必须确保所有工作的每个规则添加测试。这也将使您的控制器保持点亮状态。
您没有提供有效状态和无效状态的示例,但是我想您实际上是在谈论这3个参数的变化,例如,当类型为“ something”时,数量只能小于200,so_rep只能做“随便什么”。使用FluentValidation库可以很好地完成此操作。