.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.解决方案结构和说明

.net 网站(MVC)三层架构实践代码_第1张图片

各项目名简写~

IBLL:业务逻辑层的接口

IDAL:数据处理层的接口

BLL:业务逻辑层

Common:存放解决方案中可公用的类,如SqlHelper.cs之类

DAL:数据处理层

Model:存放数据模型

MvcApp:Web表现层

注意:各个项目之间要添加必要的相互的引用。

2.详细结构

IBLL:类库,业务逻辑层的接口,添加了两个接口

IDAL:类库,数据处理层的接口,添加了三个接口

.net 网站(MVC)三层架构实践代码_第2张图片

BLL:类库,业务逻辑层,添加了两个类


Common:类库,存放解决方案中可公用的类,如SqlHelper.cs之类,这里没有用到公用的类,什么也没添加


DAL:类库,数据处理层,添加了三个类

.net 网站(MVC)三层架构实践代码_第3张图片

Model:类库,存放数据模型,添加了ADO.NET实体数据模型Model1.edmx,对应数据表MyUser

.net 网站(MVC)三层架构实践代码_第4张图片

MvcApp:MVC3项目,Web表现层,添加了控制器HomeController.cs,添加了视图Index.cshtml, Create.cshtml

.net 网站(MVC)三层架构实践代码_第5张图片

3.各个新增类,接口等的说明

1)Model,在Model里添加实体数据模型,加入Sql server中的表MyUsers。

.net 网站(MVC)三层架构实践代码_第6张图片

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
    {
       
    }
}

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 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;
        }
    }
}

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
{
    /// 
    /// 所有的数据操作类的对象,使得业务逻辑层利用该类可拿到所有数据层的数据对象
    /// 

    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,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.不断地生成每个写好的项目,最后运行,默认结果页面
.net 网站(MVC)三层架构实践代码_第7张图片
点击左上角Create New,进入create页面:

.net 网站(MVC)三层架构实践代码_第8张图片


5. BUG!!!  尝试结果,Index方法和页面执行正常。
    但是在Create页面添加一条记录还无法保存到数据库。。。待改进。。。


你可能感兴趣的:(.Net技术)