首页 > 解决方案 > 在为 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

目前我发送硬编码的值在于新的过滤器(“状态”,“是”,“值”)。我不想这样做,我需要学习一些更精炼的东西。请让我知道您对添加每个过滤器和可维护模式的更好方法的建议

标签: c#.net.net-coredesign-patternsc#-7.1

解决方案


我认为具有多个工厂方法(允许的操作)的工厂模式适用于这个用例:

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

推荐阅读