MVC模式与三层架构整合
第2讲_Web三层架构+MVC+EasyUI数据库应用开发入门_1

1理解MVCMVC代表: 模型-视图-控制器。
MVC是一个架构良好并且易于测试和易于维护的开发模式。
基于 MVC 模式的应用程序包含:●Models:表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类。
●Views:应用程序动态生成 HTML 所使用的模板文件。
●Controllers:处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板。
本讲义将覆盖所有这些概念,并告诉你如何使用它们来构建应用程序。
1.1创建一个空的MVC4 Web应用程序运行VS2013,选择菜单“文件 > 新建 > 项目”,项目名为“ChA201_理解M VC”、项目类型为“ MVC4 Web应用程序”,如下图如下。
在新的 MVC 4 项目对话框中,选择“空”模板。
使用 Razor 作为默认视图引擎,如下图。
单击“确定”按钮。
Visual Studio 刚刚创建的 MVC 项目是一个空的项目,完成后查看建立的文件及其下面的文件,如下图。
测试运行,结果如下。
1.2添加一个控制器首先,让我们创建一个控制器类。
在解决方案资源管理器中,用鼠标右键单击控制器(Controllers)文件夹,然后选择“添加控制器”。
命名新的控制器为“HelloWorldController”。
保留默认的模板为“空MVC控制器”,并单击“添加”按钮。
这时,在解决方案资源管理器中会创建一个名为 HelloWorldController.cs 的新文件,并被 IDE 默认打开。
用下面的代码替换该文件中的内容。
public class HelloWorldController : Controller{public string Index(){return"这是一个<b>Default</b>的操作方法";}public string Wellcome(){return"这是一个 Wellcome 的操作方法";}}在上例中控制器方法将返回一个Html字符串。
JavaWeb之三层架构(MVC架构):软件设计架构

JavaWeb之三层架构(MVC架构):软件设计架构
MVC 开发模式
⼀、JSP 演变历史
1. 早期只有servlet,只能使⽤response输出标签数据,⾮常⿇烦
2. 后来⼜jsp,简化了Servlet的开发,如果过度使⽤jsp,在jsp中即写⼤量的java代码,有写html表,造成难于维护,难于分⼯协作
3. 再后来,java的web开发,借鉴 MVC 开发模式,使得程序的设计更加合理性
⼆、MVC
1. M:Model,模型。
JavaBean
完成具体的业务操作,如:查询数据库,封装对象。
2. V:View,视图。
JSP,HTML
⽤来展⽰数据。
3. C:Controller,控制器。
Servlet
①获取⽤户的输⼊
②调⽤模型
③将数据交给视图进⾏展⽰
界⾯层(表⽰层):⽤户看的得界⾯。
⽤户可以通过界⾯上的组件和服务器进⾏交互。
业务逻辑层:处理业务逻辑的。
数据访问层:操作数据存储⽂件。
MVC 是⼀种思想
MVC 的理念是将软件代码拆分称为组件,单独开发,组合使⽤(⽬的还是为了降低耦合度)
三、MVC 的优缺点
1、优点
①耦合性低,⽅便维护,可以利⽤分⼯协作;
②重⽤性⾼;
2、缺点
①使得项⽬架构变得复杂,对开发⼈员要求⾼;。
第2讲_Web三层架构+MVC+EasyUI数据库应用开发入门_3

3Web界面学生管理系统3.1项目准备参见2.1~2.3步骤创建一个“ MVC4 Web应用程序”的项目“ChA203_学生管理系统”,并准备三层架构的类库,添加JQuery和EasyUI控件,并修改web.config文件。
3.2添加主页控制器添加一个主页控制器HomeController,然后给HomeController的Index方法添加一个同名的视图,即:/Views/Home/Index.cshtml。
3.2.1添加Layout布局主页中首先放上一个Layout;通过body标签来实现布局,可以达到整个页面的布局的效果。
运行一下,如下图。
注意:地址栏中不象以前还要输入控制器中的方法,如:Home/Index就可以了,这是为什么?是由于App_Start/RouteConfig.cs中的RouteConfig类的RegisterRoutes()方法中定义了默认的访问路径为Home/Index,如下图。
public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );}}现在有些东西,我们是不希望的:去掉东区域,去掉北区域和南区域的滑动功能(去掉split属性),去掉北区域和南区域的收缩功能(去掉title属性),并调整北区域的高度为50px,调整南区域的高度为25px,调整西区域的宽度为200px;在北区域放一个长江大学教务管理系统的图片,设置西区域的标题为“导航”,设置中区域的标题为“内容”。
MVC三层架构学习总结实例

MVC三层架构学习总结实例⼀个简单的转账Servlet Demo使⽤MVC三层架构实现前端<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><style>#mainApp{font-size: 20px;font-family: "Microsoft YaHei UI",serif;text-align: center;margin-top: 200px;font-weight: bold;}</style></head><body><div id="mainApp"><form action="servlet/transfer" method="post"><p><label for="transOut">请填写转出⽤户名:</label><input type="text" id="transOut" name="transOut" required /></p> <p><label for="transIn">请填写转⼊⽤户名:</label><input type="text" id="transIn" name="transIn" required /></p><p><label for="money">请填写转账数⽬:</label><input type="text" id="money" name="money" required /></p><p><input type="submit"><input type="reset"></p></form></div></body></html>后端数据库⼯具类保证数据库调⽤的统⼀public class C3P0Utils {/*** 获取连接池* @return 返回c3p0默认连接池*/public static DataSource getDataSource(){return new ComboPooledDataSource();}/*** 获取连接* @return 返回⼀个基于c3p0连接池的连接*/public static Connection getConnection(){try {return getDataSource().getConnection();} catch (SQLException e){throw new RuntimeException("⽆法获取连接,请检查数据库配置⽂件");}}/*** 实现资源的释放* 细节在于⾸先是对于顺序的先开后关* 对于每个对象都要有try...catch保证哪怕报错了其他的对象也可以关闭* @param connection 数据库连接* @param ps 预编译sql对象* @param resultSet 数据库结果集*/public static void release(Connection connection, PreparedStatement ps, ResultSet resultSet){try {if (resultSet != null){resultSet.close();}} catch (SQLException throwables) {throwables.printStackTrace();}try {if (ps != null){ps.close();}} catch (SQLException throwables) {throwables.printStackTrace();}try {if (connection != null){connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}}model⽤于封装数据库对象public class User {private String name;private BigDecimal money;public User() {}public User(String name, BigDecimal money) { = name;this.money = money;}public String getName() {return name;}public void setName(String name) { = name;}public BigDecimal getMoney() {return money;}public void setMoney(BigDecimal money) {this.money = money;}}Dao层⽤于操作数据库/*** 此接⼝规定对User数据库的操作* @author Rainful* @create 2021/07/29*/public interface UserDao {/*** 通过name查询⽤户* @param connection 数据库连接* @param ps 预编译sql对象* @param sql sql语句* @param name ⽤户名* @param money 钱数* @throws SQLException 抛出⼀个查询错误让业务代码回滚* @return 返回⼀个可以查找到的⽤户*/int moneyTransfer(Connection connection, PreparedStatement ps,String sql, String name, double money) throws SQLException;}public class UserDaoImpl implements UserDao {@Overridepublic int moneyTransfer(Connection connection, PreparedStatement ps,String sql, String name, double money) throws SQLException { ps = connection.prepareStatement(sql);ps.setDouble(1, money);ps.setString(2, name);return ps.executeUpdate();}}业务层⽤于调⽤Dao层验证从控制层传来的参数等/*** 此接⼝⽤于规范数据库查询* @author Rainful* @create 2021/07/29*/public interface UserServlet {/*** 业务层调⽤dao层完成数据库更新及控制事务* @param name1 转出账户⽤户名* @param name2 转⼊账户⽤户名* @param money 修改* @return 修改结果*/boolean moneyTransfer(String name1, String name2, double money);}public class UserServletImpl implements UserServlet {private final UserDao userDao;public UserServletImpl() {erDao = new UserDaoImpl();}@Overridepublic boolean moneyTransfer(String name1, String name2, double money) {Connection connection = null;PreparedStatement ps = null;try {connection = C3P0Utils.getConnection();// 开启事务connection.setAutoCommit(false);// 转出账户int transOutRow = transfer(connection, ps, name1, money, -1);// 转⼊账户int transInRow = transfer(connection, ps, name2, money, 1);// 提交事务mit();return transOutRow > 0 && transInRow > 0;} catch (Exception e) {// 发⽣异常进⾏回滚处理try {connection.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}e.printStackTrace();return false;} finally {// 关闭数据库连接try {connection.setAutoCommit(true);} catch (SQLException throwables) {throwables.printStackTrace();}C3P0Utils.release(connection, ps, null);}}/*** 返回转账sql的影响⾏数** @param connection 数据库连接* @param ps 预编译sql对象* @param name 账户更改姓名* @param money 更改的钱数* @param value 为了保证⽅法共⽤性⽽设置的修改参数* 转⼊为 1, 转出为 -1* @return 返回影响的⾏数* @throws SQLException 抛出sql异常回滚*/private int transfer(Connection connection, PreparedStatement ps, String name, double money, int value) throws SQLException { // 转出账户的话因为钱是减少的String sql = "update account set money = money + ? where name = ?";return userDao.moneyTransfer(connection, ps, sql, name, money * value);}}控制层⽤于接收前端数据传输给业务层做逻辑判断@WebServlet("/servlet/transfer")public class TransferMoney extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String transOut = req.getParameter("transOut");String transIn = req.getParameter("transIn");String money = req.getParameter("money");// 三者都在前端进⾏了⾮空判断// 后续如果再加上判断就好了,因为要防⽌前端被⼈恶意修改传输数据过来long moneyNum;System.out.println(money);//System.out.println(Long.parseLong(money));try {moneyNum = Long.parseLong(money);} catch (Exception e){resp.getWriter().print("⾦额不符合规范");return;}// 调⽤业务层进⾏处理UserServlet userServlet = new UserServletImpl();boolean flag = userServlet.moneyTransfer(transOut, transIn, moneyNum);if (flag){resp.getWriter().print("转账成功");} else {resp.getWriter().print("转账失败");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}其他编码转换过滤@WebFilter("/servlet/*")public class CodeChange implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");chain.doFilter(request, response);}}权限管理过滤防⽌恶意直接访问servlet@WebFilter("/servlet/*")public class FilterServlet implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {String money = request.getParameter("money");if (money == null){((HttpServletResponse)response).sendRedirect("../index.html");}chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}}总结bug反思整体来说⼀次性写完,但是在数据库调⽤的时候发现数据库没有修改,经过单元测试排除⽅法最后发现调⽤sql的时候参数传递问题整个servlet优点完成了全部功能,实现了sql调⽤的时候connection复⽤,对⼀次业务进⾏connection的统⼀关闭sql调⽤的时候进⾏参数传递到dao层可以⼀个⽅法完成增加和减少实现了MVC三层架构,并且使⽤接⼝实现多态,并且规范了实现类的⾏为实现了编码转换及权限过滤优化⽅向后续增加业务的时候,可以抽取sql代码完成sqlUtils类的封装规范Dao层的sql调⽤增加常⽤变量的时候可以进⾏⼀个静态变量⼯具类的封装等。
MVC与三层架构图

M:JavaBean--模型 V:JSP--显示页面 C:Servlet--控制台访问M客户端(IE 等)Servlet获得客户端数据并把数据封装到域对象中CService:服务处理业务逻辑Dao:数据访问Data Access Object 数据库JavaBean:封装数据JSPV数据显示层:最顶层(第三步)业务逻辑层(第二步)数据访问层:最底层(第一步)DAO接口Service接口cn.itcast.domain:JavaBeancn.itcast.dao:DAO接口Cn.itcast.dao.impl:DAO实现cn.itcast.service:业务接口cn.itcast.service.impl:业务实现cn.itcast.web.controller:ServletWEB-INF/pages:JSP(用户无法访问,但内部可以展现给客户端)cn.itcast.util:工具类cn.itcast.exception:自定义的异常访问1调用专门用来服务的方法3取出数据45存放改变的数据546调用6取出数据7存放数据8取出数据1封装数据2封装数据2传递数据3请求7取出结果8请求转发9显示数据101、无经验就先按逆顺序开发:数据显示层——业务逻辑层——数据访问层2、为降低耦合性(为了抽掉某个部分,整个结构所受的影响不大),采取抽象编程——接口3、Structs2才真正的实现了MVC三层架构4、建模(建立JavaBean)没有建好相当于全挂,搞定了JavaBean,数据库也就搞定了。
Asp.NetMVC+EF+三层架构的完整搭建过程

MVC+EF+三层架构的完整搭建过程2018.11.3 更新:谢谢各位观看如果帮助到你了我也很⾼兴,这是我两年前写的⽂章了,当时⾃⼰也在学习,⼯作了以后才发现这个搭建的框架还有很多的缺点,当然⼊门的话绝对是够了,但是还是推荐下有兴趣的可以去学习下ABP。
如果遇到问题的话,可以去github上看⼀下,在⽂章最后有链接的,当时写的时候,我⾃⼰试过的是可以跑起来的噢。
架构图:使⽤的数据库:⼀张公司的员⼯信息表,测试数据解决⽅案项⽬设计:1.新建⼀个空⽩解决⽅案名称为Company2.在该解决⽅案下,新建解决⽅案⽂件夹(UI,BLL,DAL,Model) 当然还可以加上common3.分别在BLL,DAL,Model 解决⽅案⽂件夹下创建类库项⽬(1).BLL解决⽅案⽂件夹: Company.BLL、Company.IBLL、Company.BLLContainer(2).DAL解决⽅案⽂件夹: Company.DAL、Company.IDAL、Company.DALContainer(3).Model解决⽅案⽂件夹:Company.Model4.在UI 解决⽅案⽂件夹下添加⼀个 Web应⽤程序,名称为Company.UI,选择我们的Mvc模板. 如图:Model层: 选中Company.Model,右键=>添加=>新建项=>添加⼀个实体数据模型名称为Company=>选择来⾃数据库的EF设计器=>新建连接=>选择我们的Company数据库填⼊相应的内容选择我们的Staff表,完成后如图:这时Model层已经完成.我们的数据库连接字符串以及ef的配置都在App.Config⾥,但我们项⽬运⾏的是我们UI层的Web应⽤程序,所以我们这⾥要把App.Config⾥的配置复制到UI层的Web.Config中数据访问层: 因为每⼀个实体都需要进⾏增删改查,所以我们这⾥封装⼀个基类.选中Company.IDAL,右键=>添加⼀个名称为IBaseDAL的接⼝=>写下公⽤的⽅法签名著作权归作者所有。
MVC三层构架

MVC框架MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将业务逻辑被聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
比如一批统计数据可以分别用柱状图、饼图来表示。
C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
优点耦合性低视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。
因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
模型是自包含的,并且与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
如果把数据库从MySQL移植到Oracle,或者改变基于RDBMS数据源到LDAP,只需改变模型即可。
一旦正确的实现了模型,不管数据来自数据库或是LDAP服务器,视图将会正确的显示它们。
由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。
[11]重用性高随着技术的不断进步,需要用越来越多的方式来访问应用程序。
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。
MVC模式与三层架构结合

MVC模式与三层架构结合经过老师与同学们的长期讨论,我们决定在项目的开发过程中应用MVC模式与三层架构结合的方式来实现我们架构的设计。
这样种有两个好处:首先是可以实现多个视图,为我们开发不同的视图提供了很大的便利,使得我们在完成Web设计后没有必要在去设计Wap,减少了部分工作量;其次是运用三层架构,使结构层次清晰,各层之间能够并行设计;最后是采用这样的设计方式可以增加我们代码的重用性,减少耦合。
一、MVC模式和三层架构MVC 模式包括三个部分, 即模型( Model) 、视图( View) 和控制( Controller) , 分别对应于内部数据、数据表示和输入/ 输出控制部分。
MVC 模式的一般结构如图1 所示。
图1.MVC模式各部分的关系和功能MVC 设计模式从早期的客户/ 服务器应用发展而来, 因此, 它采用的是两层架构设计。
但由于三层架构是对两层架构的延伸, 所以还是可以将MVC 应用于三层架构的Web 应用中。
MVC 与三层架构相互结合补充, 已经成为Web 应用开发的重要模式。
MVC 模式与三层架构设计之间的关系如图2所示。
图2.MVC模式与三层架构之间的关系二、架构设计这里的架构设计与上次的三层架构概要设计大体类似,唯一不同的在于表示层。
在这里我们将表示层分为了视图与控制器。
其中视图完成页面的显示功能,而控制器主要完成视图与表示层逻辑的分离,拦截用户请求,组合模型与视图并返回相应视图给用户。
模块划分及交互设计根据前面的讨论以及上次的架构概要设计文档,可在宏观上将整个系统分为以下几个模块:实体类模块——一组实体类的集合,负责整个系统中数据的封装及传递。
数据访问层接口族——一组接口的集合,表示数据访问层的接口。
数据访问层模块——一组类的集合,完成数据访问层的具体功能,实现数据访问层接口族。
业务逻辑层模块——一组类的集合,完成业务逻辑层的具体功能,实现业务逻辑层接口族。
虚拟工厂模块——生成数据访问层实例辅助类模块——完成全局辅助性功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MVC模式与三层架构结合
经过老师与同学们的长期讨论,我们决定在项目的开发过程中应用MVC模式与三层架构结合的方式来实现我们架构的设计。
这样种有两个好处:首先是可以实现多个视图,为我们开发不同的视图提供了很大的便利,使得我们在完成Web设计后没有必要在去设计Wap,减少了部分工作量;其次是运用三层架构,使结构层次清晰,各层之间能够并行设计;最后是采用这样的设计方式可以增加我们代码的重用性,减少耦合。
一、MVC模式和三层架构
MVC 模式包括三个部分, 即模型( Model) 、视图( View) 和控制( Controller) , 分别对应于内部数据、数据表示和输入/ 输出控制部分。
MVC 模式的一般结构如图1 所示。
图1.MVC模式各部分的关系和功能
MVC 设计模式从早期的客户/ 服务器应用发展而来, 因此, 它采用的是两层架构设计。
但由于三层架构是对两层架构的延伸, 所以还是可以将MVC 应用于三层架构的Web 应用中。
MVC 与三层架构相互结合补充, 已经成为Web 应用开发的重要模式。
MVC 模式与三层架构设计之间的关系如图2所示。
图2.MVC模式与三层架构之间的关系
二、架构设计
这里的架构设计与上次的三层架构概要设计大体类似,唯一不同的在于表示层。
在这里我们将表示层分为了视图与控制器。
其中视图完成页面的显示功能,而控制器主要完成视图与表示层逻辑的分离,拦截用户请求,组合模型与视图并返回相应视图给用户。
模块划分及交互设计
根据前面的讨论以及上次的架构概要设计文档,可在宏观上将整个系统分为以下几个模块:
实体类模块——一组实体类的集合,负责整个系统中数据的封装及传递。
数据访问层接口族——一组接口的集合,表示数据访问层的接口。
数据访问层模块——一组类的集合,完成数据访问层的具体功能,实现数据访问层接口族。
业务逻辑层模块——一组类的集合,完成业务逻辑层的具体功能,实现业务逻辑层接口族。
虚拟工厂模块——生成数据访问层实例
辅助类模块——完成全局辅助性功能。
视图模块——完成整个系统页面的显示,以及系统与用户的交互工作
控制器模块——完成视图与表示层逻辑的分离,拦截用户请求,组合模型与视图并返回相应视图给用户
各模块间交互关系如下
图3.各模块之间的关系
根据以上分析大体可以得出系统将涉及到的项目:
Web——完成视图与控制器的实现
Entity——存放实体类
Factory——虚拟工厂模式的实现,完成访问层对象接口实例的生成
IDAL——存放数据访问层接口族
Utility——存放各种工具类及辅助类
DAL——数据访问层的实现
BLL——业务逻辑层的实现
三、实体类设计
实体类是现实实体在计算机中的表示。
它贯穿于整个架构,负担着在各层次及模块间传递数据的职责。
在项目中我们的实体类与数据库中的数据表一一对应,并且实体类中的属性
和表中的字段也是对应的。
系统中涉及到的实体类大致如下:个人用户、企业用户、留言、评论、商品、购物车、订单、普通资讯、行业资讯、产品、超级管理员、管理员、管理员类别、管理员与管理员类别关系类、广告等。
其中商品还涉及到商品类型:包括大类和小类;企业用户涉及到企业性质;普通资讯涉及到资讯类别;行业资讯涉及到行业资讯类别;产品涉及到产品的大类与小类。
在实体类设计的时候,我们需要为实体的各字段生成相应的属性,必须主意各实体之间的关联。
四、数据访问层接口设计
在分层架构中,接口扮演着非常重要的角色,它不但直接决定了各层中的各个操作类需要实现何种操作,而且它明确了各个层次的职责。
接口也是系统实现依赖注入机制不可缺少的部分。
本项目的接口设计将按如下顺序进行:
1.首先由前文的需求分析,列出主要的UI部分。
2.分析各个UI需要什么业务逻辑支持,从而确定业务逻辑操作。
3.分析业务逻辑层需要何种数据访问操作,从而确定数据访问层接口。
另外,为保证完全的面向对象特性,接口之间的数据传递主要靠实体类或实体类集合,禁止使用DataTable等对象传递数据。
由需求分析,可以得出用户界面(UI),在由UI可以识别业务逻辑操作,通过业务逻辑操作,我们可以得出相应的接口。
具体所涉及到的数据访问层的接口,这里就不在叙述了。
另外,个人觉得由于业务逻辑层的操作比较单一,主要是从数据访问层返回数据访问层的操作结果,所以在项目中不在添加业务逻辑层接口。
五、虚拟工厂模式设计
为了减少工作量,实现简单的依赖关系,在业务逻辑层与数据访问层之间添加一个简单的工厂来生成数据访问层实例。
具体工厂的生成方式非常简单,就是添加一个路径属性,在配置文件中把需要用到的访问层实现添加到路径中。
然后对每个接口对象生成实例并返回给业务逻辑层。
六、数据访问层的设计
在项目中我打算采用LINQ方式实现数据库的访问,主要原因是这种方式容易上手,为我们减少了不少的工作量。
大体实现方式如下:首先是根据数据表中的内容生成一个LINQ 的上下文环境类;其次是根据数据访问层接口添加各个具体的类,在类中运用LINQ查询语言完成数据访问层的操作。
在运用LINQ的过程中,如果要传入的是一些基本类型,我们就按照基本类型处理;如果是实体对象,针对写操作,我们先把实体对象的值赋给LINQ中对应实体对象,针对读操作,我们把读取的LINQ对应的实体对象转换成我们系统中自定义的实体对象在各层之间实现传输;如果查询结果是一个集合,我们依然使用传统的DataTable 方式在各层之间传输,这里需要将LINQ的查询结果转换成对应的DataTable对象。
具体的实现方法我们可以写在辅助类里面。
七、业务逻辑层设计
在实际应用中,业务逻辑层是至关重要的,他承载着整个系统最核心的部分,也是客户最关注的部分。
在本项目中,业务逻辑层主要承担以下职责。
业务逻辑数据的填充与转换。
如口令的加密等。
核心业务的实现。
这里很多业务逻辑只有一行代码,即一个业务逻辑方法恰好对应一个数据访问方法,但是也有通过多个数据访问方法实现业务的。
同时也包含一些
不需要通过数据访问实现的业务。
具体的实现这里就不在叙述,详细参看代码的实现。
八、视图设计
在项目中我们将针对Web用户和Wap用户提供不同的视图,这也是我们采用MVC模式的原因之一。
一般来说,视图的优劣有一下两个评价指标:
美观。
即外观设计漂亮,能给人美的感觉。
易用。
即具有良好的用户体验,用户用起来舒服、顺手。
另外一个重点就是如何针对不同的用户我们选择不同的视图,这里就主要用到我们上周讨论的结果,我们将在用户申请访问网站时,判定用户所持设备的浏览器是移动设备的浏览器,还是计算机的浏览器,如果是计算机的浏览器,我们将返回Web视图,如果是移动设备浏览器,我们将返回Wap视图。
具体的实现涉及到MVC模式的视图控制方面的类。
这里还需要进一步的学习与了解。
另外在视图设计的过程中,设计的方式与常用的Web Form的设计方式有很大的区别,这里就需要大家具体掌握MVC视图的设计方式。
九、控制器设计
在MVC模式中,控制器的主要作用是拦截用户访问,分离表示层逻辑,组合模型与视图并返回用户访问的相应视图。
在控制器的设计过程中,我们将针对视图的每一次跳转设计一个对应的控制方法。
对不同视图的访问也是在控制器中来实现。
另外在设计控制器的时候需要关心路由以及视图与模型之间的兼容关系。