提取码: 68vv
接下来,我们需要考虑一下基于路径“api”有什么一级路径呢?没错,就是旅游路线“api/touristroutes”,有两个方法,一个是get请求,获取旅游路线列表,另一个是post请求,创建旅游路线。
除此以外,我们还有另外两条一级链接,订单和购物车,具体的添加方法与上面讲的方法一样,不过请同学们注意一下,因为在linkdto中引用的是action函数的字符串名称,所以,我们还得打开订单和购物车控制器,给这两个api加上字符串名称。
全部链接添加完毕,我们就要可以返回响应了,响应数据就是links列表。现在,用户就可以通过访问这个api的根目录获得api的使用方法了。
route("api")]
apicontroller]
public class rootcontroller: controllerbase
httpget(name = getroot")]
public iactionresult getroot()
既然找到问题所在,那么接下来,就让我们解决这个问题吧。请同学们打开starup文件,我们可以通过services对象访问mvc option对象,来配置自定义**类型。不过我们需要使用的是哪种格式处理器呢?请同学们把目光往下移一行,我们看到在这里添加了newtonjson formatter,这就是对josn数据的格式处理器, 所以我们可以通过拓展这个。第三方插件newtonjson 来实现的自定义**类型。
services.configure(config =>
var outputformatter = config.outputformatters
oftype()?firstordefault();
if (outputformatter !=null)
说句题外话,工厂模式是程序开发的一种设计模式,如果还不懂设计模式的同学,老师强烈建议同学们课后学习一下。因为设计模式是一个合格程序员必备的知识储备,同学们在今后的工作学习中一定会经常接触到。
回到正题,刚刚说到我们要使用工厂模式来创建paginationlist的实例对象。那么就让我们开始搭建这个工厂吧。
public static async task> createasync(
int currentpage, int pagesize, iqueryable result)
pagination
skipvar skip = currentpage - 1) *pagesize;
result = result.skip(skip);
以pagesize为标准显示一定量的数据。
result = result.take(pagesize);
include vs join
var items = await result.tolistasync();
return new paginationlist(currentpage, pagesize, items);
接下来,我们来使用分页模组paginationlist。两个文件需要修改,第一个是仓库接口,gettouristroutesasync,我们要让他返回的数据类型使用我们刚刚创建分页列表类型,ienumrable替换为paginationlist。接下来,接口实现进行同样的操作,把ienumrable替换为paginationlist。
最后,在返回数据的时候,删掉分页处理的部分,返回类型使用paginationlist的实例创建工厂。
public async task> gettouristroutesasync(
string keyword,
string ratingoperator,
int? ratin**alue,
int pagesize,
int pagenumber
iqueryable result = context
touristroutes
include(t =>t.touristroutepictures);
if(!string.isnullorwhitespace(keyword))
if (ratin**alue >=0)
include vs join
return await paginationlist.createasync(pagenumber, pagesize, result);
接下来,我们还需要使用automapper处理model与dto的自动映射。在profile文件夹创建一个新profile文件,文件命名orderprofile。class继承automapper的profile,然后在构建函数中加入model到dto的映射关系。
public class orderprofile : profile
好了,automapper的映射也完成了。让我们回到controller输出数据吧,返回的响应可以使用200 ok,ok函数中传入dto数据,使用automapper _mapper,调用。map函数,《目标数据类型 orderdto>(数据源 order)
httppost("checkout")]
authorize(authenticationschemes = bearer")]
public async task checkout()
1 获得当前用户。
var userid = httpcontextaccessor
httpcontext.user.findfirst(claimtypes.nameidentifier).value;
2 使用userid获得购物车。
var shoppingcart = await _touristrouterepository.getshoppingcartbyuserid(userid);
3 创建订单。
var order = new order()
shoppingcart.shoppingcartitems = null;
4 保存数据。
await _touristrouterepository.addorderasync(order);
await _touristrouterepository.s**easync();
5 return
return ok(_mapper.map(order));
全球流动性框架系列(四) 美国货币市场的生态系
欲穷千里目,更上一层楼。autumn of 前篇,我们聊了美元准备金框架的范式转变及其衍生出的利率调控体系 传统利率走廊向 地板系统 的演化,从政策利率的角度理解了利率间是如何相互影响及 有效沟通 的。读到本篇的读者也许已经对美元流动性框架的体量之大,细节之多深有体会。笔者也以为,只有通盘考虑央行 ...
全球流动性框架系列(一) 美元潮汐 运作机理
流水不腐,户枢不蠹。summer of 当今世界,信贷 杠杆 资产 存在着显著的全球协同特征,美元潮汐 就是其中最重要的一个推动机制,即美联储通过收放美元来不断冲刷全球资产。为什么美元可以造成这么大的影响呢?一方面,自上世纪布雷顿森林体系建立开始,美元先后和价值之理 大宗之王 石油进行绑定,确立了在...
G1 系列课程 极简项目管理,业务骨干升级的制胜密码
很多业务主管都比较头疼手下员工的 项目管理 能力,明明他们单独做某项任务时,做的又好又快,可一旦给他们布置些稍复杂的 需要统筹资源的项目型工作时,他们就掉链子。问题形形色色,常见的有如下几种 上述问题,要么关乎 心态 要么关乎 认知 要么关乎 能力 如果这些bug得不到解决,将会给业务部门和员工个人...