上一节我们通过WebAPI接口读取到了分类数据,并能够在程序中呈现,这节我们完成从数据中的提取。
用C#平台来开发Web项目,数据库首选还是SQLServer。不过考虑这是入门教程,如果用SQLServer又牵涉到了相关的安装及配置,不便于演示,仍然还是沿用我们第一阶段使用的SQLite,相关代码也不需要重构了。
数据库连接
我们回顾下,在做Diary.Win的时候,我们用下面的语句就可以连接到数据库:
BAL.DBController.Default.connectToDatabase(Global.Default.DBFilepath);
只要有了数据库的文件地址就可以。在Diary.Win中,数据库的文件地址我们是这样获取的:
Global.Default.DBFilepath = string.Format("{0}{1}", Application.StartupPath, DBFilename);
然后我们尝试在Diary.WebAPI中也使用这样的代码,结果得到了这样的错误:
找不到Application的定义,大家可以先自行考虑为什么?
我们写程序的过程中就是不停地遇到问题,然后分析原因,解决问题。一个项目可以,一个项目不行,那肯定要先对比不同在哪里:
我们在Diary.Win项目中找到Application,因为这里是可以编译通过的。我们把鼠标移到Application的上面,Application一般是淡青色的,然后就会弹出这个类的释义。
我们可以看到,Application是定义在System.Windows.Forms这个命名空间下的。System.Windows.Forms是什么?是专门为WinForm程序定义的类库,只在WinForm程序下才能使用,因为WinForm的类库会直接调用Windows系统的API。而WebAPI是Web服务端程序,可能是Windows Server服务器,也可能是Liunx服务器或者其他操作系统,根本就没有WinForm程序得以依赖运行的环境,所以也就没办法支持Application这个类了。
那.net5是否存在一个与Application.StartupPath功能类似的类库或函数呢?当然是有的:
AppDomain.CurrentDomain.BaseDirectory 就是获得当前网站运行的根目录。
如下图,我们可以轻易地获得这个目录
但是从设计上考虑,这样并不好。主要是两点考虑:
1、多服务端共享
我们做的这个私人笔记是很简单的,无所谓多项目。大一点的项目管理后台与用户前台是分开的,甚至为了平衡负载,某些关键的、需要大量计算的接口会单独作为服务器来运行。而他们指向的数据库都是同一个甚至多个。如果你的数据库连接仅仅是在自己的项目中,那别人就没办法连了。
2、可维护性
网站项目不同于单机版。单机版就你一个人用,随时关随时停都没问题,有错误慢慢调。网站可能一直都有人在用,如果是写死在代码中,就意味着如果再修改,就要重新编译然后替换,有的时候你无法确定编译后会发生什么。这种事情对网站来说,越少发生越好,能通过改配置实现的,尽量不重新编译。
正确的方法是什么呢?当然是通过配置文件来定义。我们在解决方案目录中找到appsettings.json文件,然后增加:
在Startup.cs文件中读取配置:
这样就可以通过配置文件来定义数据库的路径,如果以后想要修改就直接改配置文件,网站不需要重新编译,只要重启服务就好了。
然后我们把Diary.db文件复制到网站目录,尝试运行,发现并没有成功。调试代码发现DBConnection中的中文字符竟然成了乱码,初步判断就是文件编码的问题。这种以前在做VC开发的时候太常见了,用C#开发以后少了很多。
我们用windows记事本打开appsettings.json,然后另存为时,果不其然,发现编码为ANSI
也就是说,默认生成的appsettings.json编码格式为ANSI,而读取的时候默认是按Utf-8,这个坑实在是太低级了。
记事本中在保持的时候改成UTF-8,再次运行,数据连接就成功了。
我们接下来就尝试在api接口中,从数据库返回真正的数据。
修改成红线部分的代码,然后运行:
成功读取数据。
至此,我们完成了数据从数据库->WebAPI->WASM->浏览器的呈现。相比WinForm,这个过程太漫长了。而如果我们Web采用的是Blazor Server的方式,也可以减少WebAPI的这一环节。那么是不是说WASM这种方式开发低效呢?对小项目来说确实是这样的,每个功能都要多出2-3个步骤,没有跨平台计划的,还是考虑用Blazor Server的方式吧。
如果放眼到跨平台的原生支持,上面的这些工作就不白做了。有了WebAPI作为中介,我们前端的处理就只关心界面和数据就好了,跨平台不再是问题,不同界面做不同的事情,Web也不过是其中的一种展现形式,这种方式可以让系统变得更宽。
打通了任脉后,我们接下来需要打通督脉,即把数据由浏览器写入到数据库中,下节继续。
----------------------------------------------------
本教程项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:
私人日记 可以获取相关链接;
大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!
本文暂时没有评论,来添加一个吧(●'◡'●)