.net 网站(MVC)三层架构实践代码
一.任务
创建一个.Net,C#,MVC的网站,采用三层架构,实现对一个Sql server中表数据的查询。
二.何谓三层架构
三层架构,指的是把系统分成三个部分:数据处理层(DAL:data access layer),业务逻辑层(BLL:business logical layer),表现层(USL:user show layer)。数据处理层:负责直接对数据库的增删改查。业务逻辑层:调用数据处理层,针对具体业务,把结果转给表现层。表现层:负责和用户交互(输入,输出)。
三.何谓MVC
MVC(Model,View,Controller),模型-视图-控制器。模型:指的是数据模型,简单讲,比如模型中可以
包含一个类person,具有name,sex,tele等属性,当然模型内容更加可以直接用ADO.NET实体数据模型。
视图:与用户交互展示数据。控制器:负责寻找即将响应的视图,并从模型层拿到数据,填充给视图层,再
把视图层展现出来。不同于WebForm的网站,WebForm网站中用户直接访问的就是各个aspx网页,而MVC
的网站用户直接访问的是控制器类中的方法,每个方法去准备数据,再呈现视图。
个人以为,可以把.Net 的WebForm方式和MVC方式看做两种开发网站的不同方式。前者更易上手开发速度快,而后者
在系统非常庞大而复杂时更易维护但较之前者难度大。
四.步骤
1.解决方案结构和说明
各项目名简写~
IBLL:业务逻辑层的接口
IDAL:数据处理层的接口
BLL:业务逻辑层
Common:存放解决方案中可公用的类,如SqlHelper.cs之类
DAL:数据处理层
Model:存放数据模型
MvcApp:Web表现层
注意:各个项目之间要添加必要的相互的引用。
2.详细结构
IBLL:类库,业务逻辑层的接口,添加了两个接口
IDAL:类库,数据处理层的接口,添加了三个接口
BLL:类库,业务逻辑层,添加了两个类
Common:类库,存放解决方案中可公用的类,如SqlHelper.cs之类,这里没有用到公用的类,什么也没添加
DAL:类库,数据处理层,添加了三个类
Model:类库,存放数据模型,添加了ADO.Net实体数据模型Model1.edmx,对应数据表MyUser
MvcApp:MVC3项目,Web表现层,添加了控制器HomeController.cs,添加了视图Index.cshtml, Create.cshtml
3.各个新增类,接口等的说明
1)Model,在Model里添加实体数据模型,加入Sql server中的表MyUsers。
2)IDAL,
a.添加接口 IBaseDal.cs
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace CZBK.Shop.IDAL
- {
- //放公共方法
- public interface IBaseDal<T>where T:class,new()//约束T的类型,是一个类,并且可以new()
- {
- IQueryable<T> LoadEntities(Func<T,bool>whereLambda);
- T AddEntity(T item);
- bool DeleteEntity(T item);
- bool UpdateEntity(T item);
- }
- }
b.添加接口 IDBSecssion.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.SqlClient;
- using System.Data.Objects;
- namespace CZBK.Shop.IDAL
- {
- public interface IDBSecssion
- {
- IUserInfoDal UserInfoDal { get; set; }
- int ExecuteSql(string sql, params ObjectParameter[] pars);
- //params 关键字可以指定采用数目可变的参数的方法参数
- int SaveChanges();
- }
- }
c.添加接口 IUserInfoDal.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using CZBK.Shop.Model;
- namespace CZBK.Shop.IDAL
- {
- //有专门属于MyUsers的接口方法写在下面
- public interface IUserInfoDal:IBaseDal<MyUsers>
- {
- }
- }
3)DAL
a.添加类 BaseDal.cs
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Text;
- namespace CZBK.Shop.DAL
- {
- public class BaseDal<T> where T:class,new()
- {
- //ExcrciseEntities db = new ExcrciseEntities();
- ExcrciseEntities db = DbContextFactory.GetCurrentContext();
- public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
- {
- return db.Set<T>().Where<T>(whereLambda).AsQueryable();
- }
- public T AddEntity(T item)
- {
- db.Set<T>().Add(item);
- //db.SaveChanges();
- return item;
- }
- public bool DeleteEntity(T item)
- {
- db.Set<T>().Remove(item);
- //return db.SaveChanges() > 0;
- return true;
- }
- public bool UpdateEntity(T item)
- {
- db.Entry(item).State = EntityState.Modified;
- //return db.SaveChanges() > 0;
- return true;
- }
- }
- }
b.添加类 DbContextFactory.cs
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Remoting.Messaging;
- using System.Text;
- namespace CZBK.Shop.DAL
- {
- //CallContext保证线程内创建的数据操作上下文是唯一的。
- public class DbContextFactory
- {
- public static ExcrciseEntities GetCurrentContext()
- {
- ExcrciseEntities DbContext = (ExcrciseEntities)CallContext.GetData("context");
- if (DbContext == null)
- {
- DbContext = new ExcrciseEntities();
- CallContext.SetData("context",DbContext);
- }
- return DbContext;
- }
- }
- }
c.添加类 DBSession.cs
- using CZBK.Shop.IDAL;
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Data.Objects;
- using System.Data;
- using System.Linq;
- using System.Text;
- namespace CZBK.Shop.DAL
- {
- /// <summary>
- /// 所有的数据操作类的对象,使得业务逻辑层利用该类可拿到所有数据层的数据对象
- /// </summary>
- public class DBSession : IDBSecssion
- {
- DbContext dbContext = new ExcrciseEntities();
- private IUserInfoDal _userInfoDal;
- public IUserInfoDal UserInfoDal
- {
- get
- {
- if (_userInfoDal == null)
- {
- _userInfoDal = new UserInfoDao();
- }
- return _userInfoDal;
- }
- set
- {
- _userInfoDal = value;
- }
- }
- public int ExecuteSql(string sql,params ObjectParameter[] pars)
- {
- return dbContext.Database.ExecuteSqlCommand(sql, pars);
- }
- //将业务涉及到的操作一次性的提交回数据库
- public int SaveChanges()
- {
- return dbContext.SaveChanges();
- }
- }
- }
d.添加类 UserInfoDao.cs
- using CZBK.Shop.IDAL;
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.Entity;
- using System.Data;
- namespace CZBK.Shop.DAL
- {
- public class UserInfoDao:BaseDal<MyUsers>,IUserInfoDal
- {
- }
- }
4)IBLL
a.添加接口 IBaseManager.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using CZBK.Shop.IDAL;
- namespace CZBK.Shop.IBLL
- {
- public interface IBaseManager<T> where T:class,new()
- {
- IDBSecssion dbSecssion { get; }
- IBaseDal<T> CurrentDal { get; set; }
- IQueryable<T> LoadEntities(Func<T,bool> whereLambda);
- bool AddEntity(T entity);
- bool UpdateEntity(T entity);
- bool DeleteEntity(T entity);
- }
- }
b.添加接口 IUserInfoManager.cs
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace CZBK.Shop.IBLL
- {
- public interface IUserInfoManager:IBaseManager<MyUsers>
- {
- }
- }
5)BLL
a.添加类 BaseManager.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using CZBK.Shop.DAL;
- using CZBK.Shop.IDAL;
- namespace CZBK.Shop.BLL
- {
- //业务层中公共的内容
- public abstract class BaseManager<T> where T:class,new()
- {
- public IDBSecssion dbSecssion
- {
- get{ return new DBSession(); }
- }
- //当前要用到的数据操作类的实例
- public IBaseDal<T> CurrentDal
- {
- get;
- set;
- }
- public abstract void SetCurrentDal();
- public BaseManager()//子类必须实现该抽象方法
- {
- SetCurrentDal();
- }
- public IQueryable<T> LoadEntities(Func<T,bool>whereLambda)
- {
- return CurrentDal.LoadEntities(whereLambda);
- }
- public bool AddEntity(T entity)
- {
- CurrentDal.AddEntity(entity);
- return dbSecssion.SaveChanges() > 0;
- }
- public bool DeleteEntity(T entity)
- {
- CurrentDal.DeleteEntity(entity);
- return dbSecssion.SaveChanges() > 0;
- }
- public bool UpdateEntity(T entity)
- {
- CurrentDal.UpdateEntity(entity);
- return dbSecssion.SaveChanges() > 0;
- }
- }
- }
b.添加类 UserInfoManager.cs
- using CZBK.Shop.IBLL;
- using CZBK.Shop.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- //BLL业务逻辑层
- namespace CZBK.Shop.BLL
- {
- public class UserInfoManager : BaseManager<MyUsers> ,IUserInfoManager
- {
- public override void SetCurrentDal()
- {
- CurrentDal = this.dbSecssion.UserInfoDal;
- }
- //public void SetInfo()
- //{
- // dbSecssion.UserInfoDal.AddEntity(userInfo);
- //}
- }
- }
6)Common,这个项目里暂时没有添加任何东西。
7)MvcApp
a.在Controllers文件夹下添加控制器HomeController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using CZBK.Shop.IBLL;
- using CZBK.Shop.IDAL;
- using CZBK.Shop.BLL;
- using CZBK.Shop.DAL;
- using CZBK.Shop.Model;
- namespace CZBK.Shop.MvcApp.Controllers
- {
- public class HomeController : Controller
- {
- IBLL.IUserInfoManager bll = new UserInfoManager();
- public ActionResult Index()
- {
- var temp = bll.LoadEntities(u => true);
- return View(temp);
- }
- public ActionResult Create()
- {
- return View();
- }
- [HttpPost]
- public ActionResult Create(MyUsers user)
- {
- bll.AddEntity(user);
- return RedirectToAction("Index");
- }
- }
- }
b.在上面控制器HomeController.cs的 Index方法上右击-添加视图-强类型-List-Razor,
项目自动在Views文件夹下生成Index.cshtml,该文件无需更改。
c.在Create方法上右击右击-添加视图-强类型-Create-Razor,
项目自动在Views文件夹下生成Create.cshtml,该文件无需更改。
4.不断地生成每个写好的项目,最后运行,默认结果页面
点击左上角Create New,进入create页面:
5. BUG!!! 尝试结果,Index方法和页面执行正常。
但是在Create页面添加一条记录还无法保存到数据库。。。待改进。。。
posted on 2017-06-08 15:43 alex5211314 阅读(491) 评论(0) 编辑 收藏 举报