Fork me on GitHub

OneOf<T1,…,Tn>清新

OneOf——其中之一,这是一个泛型类,意思就是这里泛型中的任何一个类都可以,还是看代码吧。

引入包

install-package OneOf

实现一个产品查询,有三种情况,查询到返回;查询不到;查询出错。

    [ApiController]
    [Route("[controller]")]
    public class HomeController : ControllerBase
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        [HttpGet("/product/{id}")]
        public IActionResult Get(int id)
        {
            OneOf<Product, NotFound, SystemError> result = GetProject(id);
            return result.Match<IActionResult>(
                product =>
                {
                    _logger.LogInformation("查询成功");
                    return new JsonResult(product);
                },
                notfound =>
                {
                    _logger.LogInformation("没有查到");
                    return new NotFoundResult();
                },
                systemerror =>
                {
                    _logger.LogError("查询成败");
                    return new StatusCodeResult(500);
                });
        }
        /// <summary>
        /// 按ID查询产品,有三种返回类型,找到产品返回;按ID查询不到;查询过程发生错误
        /// </summary>
        /// <param name="id"></param>
        public OneOf<Product, NotFound, SystemError> GetProject(int id)
        {
            try
            {
                //这里实现真实查库
                var num = RandomNumberGenerator.GetInt32(1, 10);
                if (num % 3 == 0)
                {
                    return new NotFound();
                }
                else
                {
                    return new Product() { ID = id, Name = "手机" };
                }
            }
            catch (Exception exc)
            {
                _logger.LogCritical(exc, exc.Message);
                return new SystemError();
            }
        }
    }

    public class NotFound
    {
    }
    public class SystemError
    {
    }
    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

  可以看到,NotFound,SystemError,Product三个类是没有任何关系的,是独立的类,这里通过OneOf<>,来实现返回任何类型都可以,按照OOP的思路,需要三个类继承一个父类来实现,现在用OneOf<>,把这种继承“解耦”了。

 
  想要更快更方便的了解相关知识,可以关注微信公众号 

 

 

 

posted @ 2022-02-04 09:18  桂素伟  阅读(43)  评论(0编辑  收藏  举报