使用ABP构建WebAPI的心得

本人多年winform经验,但是web方面做得很少,现在在用ABP做Web程序,以下是一些心得体会。可能弯路比较多。。。

现在有个需求是使用ajax加载jsTree做导航,这里就需要创建webapi了,参考了一些技术文档:

基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

构建Web API控制器

在Application下定义了如下接口和类用于测试:

 public interface INaviTreeAppService : IApplicationService
    {

        ListResultOutput<NaviTreeOutput> GetNaviTreeOutputs();

        //[HttpGet]
        NaviTreeOutput GetTopNode();
    }
public class NaviTreeManagerAppService : ApplicationService, INaviTreeAppService
    {
        private readonly IRepository<DepartMent> _departmentRepository;
        public NaviTreeAppService(IRepository<DepartMent> departmentRepository )
        {
            _departmentRepository = departmentRepository;
        }
        public ListResultOutput<Dto.NaviTreeOutput> GetNaviTreeOutputs()
        {
            var list = new List<Dto.NaviTreeOutput>();
            var opt = new Dto.NaviTreeOutput(); 
            opt.id = "1";
            opt.parent = "#";
            opt.text = "监控单位1";
            opt.state=new StateObj(){selected=true,opened=true};
            list.Add(opt);
            opt = new Dto.NaviTreeOutput();
            opt.id = "2";
            opt.parent = "#";
            opt.text = "监控单位2";
            opt.state = new StateObj() {  opened = true };
            list.Add(opt);
            opt = new Dto.NaviTreeOutput();
            opt.id = "3";
            opt.parent = "1";
            opt.text = "监控子单位11";
            opt.state = new StateObj() {  opened = true };
            list.Add(opt);
            opt = new Dto.NaviTreeOutput();
            opt.id = "4";
            opt.parent = "1";
            opt.text = "监控子单位12";
            opt.state = new StateObj() { opened = true };
            list.Add(opt);
            opt = new Dto.NaviTreeOutput();
            opt.id = "5";
            opt.parent = "2";
            opt.text = "监控子单位21";
            opt.state = new StateObj() { opened = true };
            list.Add(opt);
            opt = new Dto.NaviTreeOutput();
            opt.id = "6";
            opt.parent = "2";
            opt.text = "监控子单位22";
            opt.state = new StateObj() { opened = true };
            list.Add(opt);

            return  new ListResultOutput<NaviTreeOutput>(list);
        }
        

        public NaviTreeOutput GetTopNode()
        {
            var opt = new Dto.NaviTreeOutput();
            opt.id = "1";
            opt.parent = "#";
            opt.text = "监控单位1";
            opt.state = new StateObj() { selected = true, opened = true };
            return opt;
        }
    }

  在webapimodule中添加如下解析,将Post改为Get访问:

DynamicApiControllerBuilder.For<INaviTreeAppService>("DepartAndNavi/NaviTree").ForMethod("GetTopNode").WithVerb(HttpVerb.Get).Build();

  在浏览器中输入路径后,发现报错:{"message":"An error has occurred."}

  打开地址:http://localhost:6634/api/abpServiceProxies/GetAll 发现确实有此api,但是访问就是报错。

重新读了好几遍相关文档,对比了现有的abpzero定义,都没有发现什么。

但是看到webapimodule文件的动态解析:

DynamicApiControllerBuilder
                .ForAll<IApplicationService>(typeof(WebMonitorApplicationModule).Assembly, "app")
                .Build();

  我觉得我写了application层的定义,那么就应该解析出我的INaviTreeAppService中定义的api,所以我删除了自定义的解析,

然后访问http://localhost:6634/api/abpServiceProxies/GetAll查看,发现没有INaviTreeAppService的webapi定义。

这时终于知道具体的错误地点了,肯定是application层写的不对,又是读文档又是对比代码。

终于让我发现了错误的地方了:Zero写的都是对应的,比如ITenantAppService和TenantAppService;IRoleAppService和RoleAppService

而我的INaviTreeAppService 和 NaviTreeManagerAppService 则不是如此,然后将NaviTreeManagerAppService 改为NaviTreeAppService后成功了。

看来abp也继承了mvc中默认规则的设置,IAppService跟实现类AppService必须是名称相同。

 

转载于:https://www.cnblogs.com/vevi/p/5439565.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值