一.任务
创建一个.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方式看做两种开发网站的不同方式。前者更易上手开发速度快,而后者
在系统非常庞大而复杂时更易维护但较之前者难度大。
各项目名简写~
IBLL:业务逻辑层的接口
IDAL:数据处理层的接口
BLL:业务逻辑层
Common:存放解决方案中可公用的类,如SqlHelper.cs之类
DAL:数据处理层
Model:存放数据模型
MvcApp:Web表现层
注意:各个项目之间要添加必要的相互的引用。
2.详细结构
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> { } }
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; } } }
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(); } } }
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页面添加一条记录还无法保存到数据库。。。待改进。。。