您的位置:首页 > 运维架构 > 网站架构

.net 网站(MVC)三层架构实践代码

2014-03-03 17:47 435 查看
一.任务

    创建一个.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页面添加一条记录还无法保存到数据库。。。待改进。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: