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<>,把这种继承“解耦”了。