c# - 在为 API 请求形成 c# 对象时需要更好的设计
问题描述
我有 json 请求,我需要发送到以下格式的 API
{
"FilterName": "City",
"Operator": "is",
"Values": ["city name"]
},
在上面的请求中,过滤器名称可以是城市、州、街道,并且每个城市都有一组特定的运算符:[is,contains], state:[is], streetNumber"[range,is,contains]
我想为此创建 c# 模式
创建一个类,强制使用我们提供的过滤器列表和适当的运算符。
API 提供了 100 种过滤器类型,但我需要我的应用程序只允许其中的几个。
例如:
与州和城市的请求(下面的请求只是我对它应该是什么样子的想法,它必须是流利的)
Filterarray().AddFilter(StreetName().AddOperator("is)) // addoperator 应该允许 is Filterarray().AddFilter(Cities().AddOperator("is/contans)) // addoperator 应该允许 is / contains
目前我发送硬编码的值在于新的过滤器(“状态”,“是”,“值”)。我不想这样做,我需要学习一些更精炼的东西。请让我知道您对添加每个过滤器和可维护模式的更好方法的建议
解决方案
我认为具有多个工厂方法(允许的操作)的工厂模式适用于这个用例:
public abstract class Filter
{
public string FilterName { get; }
public string Operator { get; }
public string[] Values { get; }
protected Filter(string filterName, string op, string[] values)
{
FilterName = filterName;
Operator = op;
Values = values;
}
}
public class CityFilter : Filter
{
private CityFilter(string op, string value) : base("City", op, new string[] { value })
{ }
public static CityFilter Is(string value) => new CityFilter("is", value);
public static CityFilter Contains(string value) => new CityFilter("contains", value);
}
public class StateFilter : Filter
{
private StateFilter(string op, string value) : base("State", op, new string[] { value })
{ }
public static StateFilter Is(string value) => new StateFilter("is", value);
}
public class Program
{
public static async Task Main(string[] args)
{
var city = CityFilter.Contains("city name");
var state = StateFilter.Is("state name");
// Serialize and send filter
}
}
推荐阅读
- point-cloud-library - 沿 z 轴旋转点云
- jquery - Jquery Ajax 使用 POST 将数据发送到端点
- python - 使用扩展选择参数自动化 Jenkins 作业
- javascript - 如何在 Electron.js 中最小化和最大化?
- notepad++ - 在 Notepad++ 中搜索字符串和换行符
- java - 如何在 Spring Boot 上设置不安全的连接?
- python - 根据熊猫中另一个选项卡中的匹配更改值
- mysql - 如何在 mySQL 工作台中创建函数
- node.js - 有没有在node js的socket程序中连接客户端和服务器的解决方案
- groovy - Groovy - 循环通过 JSON 对象并将值填充为单行