.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

 

[csharp] view plain copy
 
  1. using CZBK.Shop.Model;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6.   
  7. namespace CZBK.Shop.IDAL  
  8. {  
  9.     //放公共方法  
  10.     public interface IBaseDal<T>where T:class,new()//约束T的类型,是一个类,并且可以new()  
  11.     {  
  12.         IQueryable<T> LoadEntities(Func<T,bool>whereLambda);  
  13.         T AddEntity(T item);  
  14.         bool DeleteEntity(T item);  
  15.         bool UpdateEntity(T item);  
  16.     }  
  17. }  

b.添加接口 IDBSecssion.cs

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data.SqlClient;  
  6. using System.Data.Objects;  
  7.   
  8. namespace CZBK.Shop.IDAL  
  9. {  
  10.     public interface IDBSecssion  
  11.     {  
  12.         IUserInfoDal UserInfoDal { get; set; }  
  13.   
  14.         int ExecuteSql(string sql, params ObjectParameter[] pars);  
  15.         //params  关键字可以指定采用数目可变的参数的方法参数  
  16.         int SaveChanges();  
  17.     }  
  18. }  

c.添加接口 IUserInfoDal.cs

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using CZBK.Shop.Model;  
  6.   
  7. namespace CZBK.Shop.IDAL  
  8. {  
  9.     //有专门属于MyUsers的接口方法写在下面  
  10.     public interface IUserInfoDal:IBaseDal<MyUsers>  
  11.     {  
  12.          
  13.     }  
  14. }  


3)DAL

 

a.添加类 BaseDal.cs

 

[csharp] view plain copy
 
  1. using CZBK.Shop.Model;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Data;  
  5. using System.Linq;  
  6. using System.Text;  
  7.   
  8. namespace CZBK.Shop.DAL  
  9. {  
  10.     public class BaseDal<T> where T:class,new()  
  11.     {  
  12.         //ExcrciseEntities db = new ExcrciseEntities();  
  13.         ExcrciseEntities db = DbContextFactory.GetCurrentContext();  
  14.   
  15.         public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)  
  16.         {  
  17.             return db.Set<T>().Where<T>(whereLambda).AsQueryable();  
  18.         }  
  19.   
  20.         public T AddEntity(T item)  
  21.         {  
  22.             db.Set<T>().Add(item);  
  23.             //db.SaveChanges();  
  24.             return item;  
  25.         }  
  26.   
  27.         public bool DeleteEntity(T item)  
  28.         {  
  29.             db.Set<T>().Remove(item);  
  30.             //return db.SaveChanges() > 0;  
  31.             return true;  
  32.         }  
  33.   
  34.         public bool UpdateEntity(T item)  
  35.         {  
  36.             db.Entry(item).State = EntityState.Modified;  
  37.             //return db.SaveChanges() > 0;  
  38.             return true;  
  39.         }  
  40.     }  
  41. }  


b.添加类 DbContextFactory.cs

 

 

[csharp] view plain copy
 
  1. using CZBK.Shop.Model;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Runtime.Remoting.Messaging;  
  6. using System.Text;  
  7.   
  8. namespace CZBK.Shop.DAL  
  9. {  
  10.     //CallContext保证线程内创建的数据操作上下文是唯一的。  
  11.     public class DbContextFactory  
  12.     {  
  13.         public static ExcrciseEntities GetCurrentContext()  
  14.         {  
  15.             ExcrciseEntities DbContext = (ExcrciseEntities)CallContext.GetData("context");  
  16.             if (DbContext == null)  
  17.             {  
  18.                 DbContext = new ExcrciseEntities();  
  19.                 CallContext.SetData("context",DbContext);  
  20.             }  
  21.             return DbContext;  
  22.         }  
  23.     }  
  24. }  

c.添加类 DBSession.cs

[csharp] view plain copy
 
  1. using CZBK.Shop.IDAL;  
  2. using CZBK.Shop.Model;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Data.Entity;  
  6. using System.Data.Objects;  
  7. using System.Data;  
  8. using System.Linq;  
  9. using System.Text;  
  10.   
  11. namespace CZBK.Shop.DAL  
  12. {  
  13.     /// <summary>  
  14.     /// 所有的数据操作类的对象,使得业务逻辑层利用该类可拿到所有数据层的数据对象  
  15.     /// </summary>  
  16.   
  17.     public class DBSession : IDBSecssion  
  18.     {  
  19.         DbContext dbContext = new ExcrciseEntities();  
  20.           
  21.   
  22.         private IUserInfoDal _userInfoDal;  
  23.         public IUserInfoDal UserInfoDal  
  24.         {  
  25.             get  
  26.             {  
  27.                 if (_userInfoDal == null)  
  28.                 {  
  29.                     _userInfoDal = new UserInfoDao();  
  30.                 }  
  31.                 return _userInfoDal;  
  32.             }  
  33.             set  
  34.             {  
  35.                 _userInfoDal = value;  
  36.             }  
  37.         }  
  38.   
  39.   
  40.   
  41.   
  42.         public int ExecuteSql(string sql,params ObjectParameter[] pars)  
  43.         {  
  44.             return dbContext.Database.ExecuteSqlCommand(sql, pars);  
  45.         }  
  46.   
  47.         //将业务涉及到的操作一次性的提交回数据库  
  48.         public int SaveChanges()  
  49.         {  
  50.             return dbContext.SaveChanges();  
  51.         }  
  52.     }  
  53. }  


d.添加类 UserInfoDao.cs

 

 

[csharp] view plain copy
 
  1. using CZBK.Shop.IDAL;  
  2. using CZBK.Shop.Model;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Linq;  
  6. using System.Text;  
  7. using System.Data.Entity;  
  8. using System.Data;  
  9.   
  10. namespace CZBK.Shop.DAL  
  11. {  
  12.     public class UserInfoDao:BaseDal<MyUsers>,IUserInfoDal  
  13.     {  
  14.           
  15.     }  
  16. }  

4)IBLL

 

a.添加接口 IBaseManager.cs

 

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using CZBK.Shop.IDAL;  
  6.   
  7. namespace CZBK.Shop.IBLL  
  8. {  
  9.     public interface IBaseManager<T> where T:class,new()  
  10.     {  
  11.         IDBSecssion dbSecssion { get; }  
  12.         IBaseDal<T> CurrentDal { get; set; }  
  13.         IQueryable<T> LoadEntities(Func<T,bool> whereLambda);  
  14.   
  15.         bool AddEntity(T entity);  
  16.         bool UpdateEntity(T entity);  
  17.         bool DeleteEntity(T entity);  
  18.     }  
  19. }  

b.添加接口 IUserInfoManager.cs

[csharp] view plain copy
 
  1. using CZBK.Shop.Model;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6.   
  7. namespace CZBK.Shop.IBLL  
  8. {  
  9.     public interface IUserInfoManager:IBaseManager<MyUsers>  
  10.     {  
  11.          
  12.     }  
  13. }  

5)BLL

 

a.添加类 BaseManager.cs

 

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using CZBK.Shop.DAL;  
  6. using CZBK.Shop.IDAL;  
  7. namespace CZBK.Shop.BLL  
  8. {  
  9.     //业务层中公共的内容  
  10.     public abstract class BaseManager<T> where T:class,new()  
  11.     {  
  12.         public IDBSecssion dbSecssion  
  13.         {  
  14.             get{ return new DBSession(); }  
  15.         }  
  16.   
  17.         //当前要用到的数据操作类的实例  
  18.         public IBaseDal<T> CurrentDal  
  19.         {  
  20.             get;  
  21.             set;  
  22.         }  
  23.   
  24.         public abstract void SetCurrentDal();  
  25.   
  26.         public BaseManager()//子类必须实现该抽象方法  
  27.         {  
  28.             SetCurrentDal();  
  29.         }  
  30.   
  31.         public IQueryable<T> LoadEntities(Func<T,bool>whereLambda)  
  32.         {  
  33.             return CurrentDal.LoadEntities(whereLambda);  
  34.         }  
  35.   
  36.         public bool AddEntity(T entity)  
  37.         {  
  38.             CurrentDal.AddEntity(entity);  
  39.             return dbSecssion.SaveChanges() > 0;  
  40.         }  
  41.   
  42.         public bool DeleteEntity(T entity)  
  43.         {  
  44.             CurrentDal.DeleteEntity(entity);  
  45.             return dbSecssion.SaveChanges() > 0;  
  46.   
  47.         }  
  48.   
  49.         public bool UpdateEntity(T entity)  
  50.          {  
  51.             CurrentDal.UpdateEntity(entity);  
  52.             return dbSecssion.SaveChanges() > 0;  
  53.         }  
  54.   
  55.     }          
  56. }  

b.添加类 UserInfoManager.cs

[csharp] view plain copy
 
  1. using CZBK.Shop.IBLL;  
  2. using CZBK.Shop.Model;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Linq;  
  6. using System.Text;  
  7.   
  8. //BLL业务逻辑层  
  9. namespace CZBK.Shop.BLL  
  10. {  
  11.     public class UserInfoManager : BaseManager<MyUsers> ,IUserInfoManager  
  12.     {  
  13.   
  14.         public override void SetCurrentDal()  
  15.         {  
  16.             CurrentDal = this.dbSecssion.UserInfoDal;  
  17.         }  
  18.   
  19.         //public void SetInfo()  
  20.         //{  
  21.         //    dbSecssion.UserInfoDal.AddEntity(userInfo);  
  22.         //}  
  23.   
  24.     }  
  25. }  

6)Common,这个项目里暂时没有添加任何东西。

 

7)MvcApp

a.在Controllers文件夹下添加控制器HomeController.cs

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using CZBK.Shop.IBLL;  
  7. using CZBK.Shop.IDAL;  
  8. using CZBK.Shop.BLL;  
  9. using CZBK.Shop.DAL;  
  10. using CZBK.Shop.Model;  
  11.   
  12. namespace CZBK.Shop.MvcApp.Controllers  
  13. {  
  14.     public class HomeController : Controller  
  15.     {  
  16.   
  17.         IBLL.IUserInfoManager bll = new UserInfoManager();  
  18.   
  19.         public ActionResult Index()  
  20.         {  
  21.             var temp = bll.LoadEntities(u => true);  
  22.             return View(temp);  
  23.         }  
  24.   
  25.         public ActionResult Create()  
  26.         {  
  27.             return View();  
  28.         }  
  29.   
  30.         [HttpPost]  
  31.         public ActionResult Create(MyUsers user)  
  32.         {  
  33.             bll.AddEntity(user);  
  34.             return RedirectToAction("Index");  
  35.         }  
  36.     }  
  37. }  

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编辑  收藏  举报

导航