一.任务
创建一个.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 IBaseDalwhere T:class,new()//约束T的类型,是一个类,并且可以new()
{
IQueryable LoadEntities(FuncwhereLambda);
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
{
}
}
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 where T:class,new()
{
//ExcrciseEntities db = new ExcrciseEntities();
ExcrciseEntities db = DbContextFactory.GetCurrentContext();
public IQueryable LoadEntities(Func whereLambda)
{
return db.Set().Where(whereLambda).AsQueryable();
}
public T AddEntity(T item)
{
db.Set().Add(item);
//db.SaveChanges();
return item;
}
public bool DeleteEntity(T item)
{
db.Set().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
{
///
/// 所有的数据操作类的对象,使得业务逻辑层利用该类可拿到所有数据层的数据对象
///
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,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 where T:class,new()
{
IDBSecssion dbSecssion { get; }
IBaseDal CurrentDal { get; set; }
IQueryable LoadEntities(Func 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
{
}
}
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 where T:class,new()
{
public IDBSecssion dbSecssion
{
get{ return new DBSession(); }
}
//当前要用到的数据操作类的实例
public IBaseDal CurrentDal
{
get;
set;
}
public abstract void SetCurrentDal();
public BaseManager()//子类必须实现该抽象方法
{
SetCurrentDal();
}
public IQueryable LoadEntities(FuncwhereLambda)
{
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 ,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页面添加一条记录还无法保存到数据库。。。待改进。。。