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<>,把这种继承“解耦”了。
想要更快更方便的了解相关知识,可以关注微信公众号