Asp.NetMVC+EF+三层架构的完整搭建过程
2018.11.3 更新:
谢谢各位观看如果帮助到你了我也很⾼兴,这是我两年前写的⽂章了,当时⾃⼰也在学习,⼯作了以后才发现这个搭建的框架还有很多的缺点,当然⼊门的话绝对是够了,但是还是推荐下有兴趣的可以去学习下ABP。
如果遇到问题的话,可以去github上看⼀下,在⽂章最后有链接的,当时写的时候,我⾃⼰试过的是可以跑起来的噢。
架构图:
使⽤的数据库:
⼀张公司的员⼯信息表,测试数据
解决⽅案项⽬设计:
1.新建⼀个空⽩解决⽅案名称为Company
2.在该解决⽅案下,新建解决⽅案⽂件夹(UI,BLL,DAL,Model) 当然还可以加上common
3.分别在BLL,DAL,Model 解决⽅案⽂件夹下创建类库项⽬
(1).BLL解决⽅案⽂件夹: Company.BLL、Company.IBLL、Company.BLLContainer
(2).DAL解决⽅案⽂件夹: Company.DAL、Company.IDAL、Company.DALContainer
(3).Model解决⽅案⽂件夹:Company.Model
4.在UI 解决⽅案⽂件夹下添加⼀个ASP.NET Web应⽤程序,名称为Company.UI,选择我们的Mvc模板. 如图:
Model层: 选中Company.Model,右键=>添加=>新建项=>添加⼀个ADO.NET实体数据模型名称为Company=>选择来⾃数据库的EF设计器=>新建连接=>选择我们的Company数据库填⼊相应的内容
选择我们的Staff表,完成后如图:
这时Model层已经完成.我们的数据库连接字符串以及ef的配置都在App.Config⾥,但我们项⽬运⾏的是我们UI层的Web应⽤程序,所以我们这⾥要把App.Config⾥的配置复制到UI层的Web.Config中数据访问层: 因为每⼀个实体都需要进⾏增删改查,所以我们这⾥封装⼀个基类.选中Company.IDAL,右键=>添加⼀个名称为IBaseDAL的接⼝=>写下公⽤的⽅法签名
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Company.IDAL
{
public partial interface IBaseDAL<T> where T : class, new()
{
void Add(T t);
void Delete(T t);
void Update(T t);
IQueryable<T> GetModels(Expression<Func<T, bool>> whereLambda);
IQueryable<T> GetModelsByPage<type>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, type>> OrderByLambda, Expression<Func<T, ///<summary>
///⼀个业务中有可能涉及到对多张表的操作,那么可以将操作的数据,打上相应的标记,最后调⽤该⽅法,将数据⼀次性提交到数据库中,避免了多次链接数据库。
///</summary>
bool SaveChanges();
}
}
基类接⼝封装完成.然后选中Company.IDAL,右键=>添加⼀个名称为IStaffDAL的接⼝=>继承⾃基类接⼝
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Company.Model;
namespace Company.IDAL
{
public partial interface IStaffDAL:IBaseDAL<Staff>
{
}
}
IDAL完成,接下来是DAL 选中Company.DAL=>右键=>添加⼀个类,名称为:BaseDAL,该类是我们
对IBaseDAL具体的实现,我们这⾥需要⽤到ef上下⽂对象,所以添加引⽤EntityFramework.dll和EntityFramework.SqlServer.dll(这⾥是ef6版本不同引⽤的dll也可能不同) 上⾯说到我们这⾥要⽤到ef下上⽂对象,我们这⾥不能直接new,因为这样的话可能会造成数
据混乱,所以要让ef上下⽂对象保证线程内唯⼀。我们选中Company.DAL=>右键=>添加⼀个类.名称为DbContextFactory.通过这个类才创建ef上下⽂对象.
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using Company.Model;
namespace Company.DAL
{
public partial class DbContextFactory
{
///<summary>
/
//创建EF上下⽂对象,已存在就直接取,不存在就创建,保证线程内是唯⼀。
///</summary>
public static DbContext Create()
{
DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
if (dbContext==null)
{
dbContext=new CompanyEntities();
CallContext.SetData("DbContext",dbContext);
}
return dbContext;
}
}
}
EF上下⽂对象创建⼯⼚完成,这时我们来完成我们的BaseDAL
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Company.IDAL;
using System.Linq.Expressions;
namespace Company.DAL
{
public partial class BaseDAL<T> where T : class, new()
{
private DbContext dbContext = DbContextFactory.Create();
public void Add(T t)
{
dbContext.Set<T>().Add(t);
}
public void Delete(T t)
{
dbContext.Set<T>().Remove(t);
}
public void Update(T t)
{
dbContext.Set<T>().AddOrUpdate(t);
}asp查看源码配置ui
public IQueryable<T> GetModels(Expression<Func<T, bool>> whereLambda)
{
return dbContext.Set<T>().Where(whereLambda);
}
public IQueryable<T> GetModelsByPage<type>(int pageSize, int pageIndex, bool isAsc,
Expression<Func<T, type>> OrderByLambda, Expression<Func<T, bool>> WhereLambda)
{
//是否升序
if (isAsc)
{
return dbContext.Set<T>().Where(WhereLambda).OrderBy(OrderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);
}
else
{
return dbContext.Set<T>().Where(WhereLambda).OrderByDescending(OrderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);            }
}
public bool SaveChanges()
{
return dbContext.SaveChanges() > 0;
}
}
}
BaseDAL完成后,我们在添加⼀个类名称为StaffDAL,继承⾃BaseDAL,实现IStaffDAL接⼝
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Company.IDAL;
using Company.Model;
namespace Company.DAL
{
public partial class StaffDAL:BaseDAL<Staff>,IStaffDAL
{
}
}
StaffDAL完成后,我们要完成的是DALContainer,该类库主要是创建IDAL的实例对象,我们这⾥可以⾃⼰写⼀个⼯⼚也可以通过⼀些第三⽅的IOC框架,这⾥使⽤Autofac 1.选中DALContainer=>右键=>管理Nuget程序包=>搜索Autofac=>下载安装对应,net版本的AutoFac 2.安装完成后,我们在DALContainer下添加⼀个名为Container的类.
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。
作者:卷猫
链接:anneke/ArticleInfo/Detial?id=11
来源:Anneke
using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Company.DAL;
using Company.IDAL;
namespace Company.DALContainer
{
public class Container
{
///<summary>
/
// IOC 容器
///</summary>
public static IContainer container = null;
///<summary>
///获取 IDal 的实例化对象
///</summary>
///<typeparam name="T"></typeparam>
///<returns></returns>
public static T Resolve<T>()
{
try
{
if (container == null)
{
Initialise();
}
}
catch (System.Exception ex)
{
throw new System.Exception("IOC实例化出错!" + ex.Message);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。