2.MVC各个层直接的关系
MODEL
IDAL -> MODEL
DAL -> IDAL(数据父类接口),MODEL ,EntityFramewrok(注意和MODEL里的EntityFramewrok版本要一致),System.Data.Entity
IBLL -> MODEL
BLL -> IBLL,IDAL,MODEL,DI
Controller -> IBLL,MODEL,DI
Web -> Controller,MODEL
IDAL.TT->IBaseDAL
DAL.TT->BaseDAL,IDAL
业务子模版IBLL.TT->继承IBaseBLL业务父类。
业务子模版BLL.TT->继承BaseBLL业务父类,继承IBLL业务父接口。
类似于抽象工厂,在IDAL里添加一个让一下子访问到所有的数据子类的方式。
业务子BLL.cs定义了增删改查方法等等。
mvc中的cotroller:一定要继承于:程序集:扩展中的system.web.Mvc
或者是packages文件下:packages\Microsoft.AspNet.Mvc.4.0.30506.0
路由配置里: //namespaces:命名空间
namespaces: new string[1] { "MVCOA.Logic"}//控制器所在类的程序集的命名空间 [也是性能的提升]
T4模板:根据T4模板根据.edmx文件生成了每一个数据层接口和业务层接口。
public class BaseDAL<T>:IDAL.IBaseDAL<T>where T:class,new()//where T:class,new():作用是约束接口,返回的必须是类,无参数的构造函数
===========================================================================================================》
IDAL(数据接口)
IDBSession.cs(一定要和下面IDBSessionExtension.tt模版生成的接口相同)
IDBSessionExtension.tt模版:生成所有接口属性;供给访问。冽如:IBill_LeaveDAL IBill_LeaveDAL{get;set;}IDBSession接口类名称和这个模版里的类名称相同(负责回
出现,IDBSessiion接口继承不了IDBSessionExtension.tt模版)。
IDBSessionFactory(数据仓储工厂)
DBLMSSQL(数据层:实现数据接口)
DBsession类:DBsession.IDBSession
DBsessionFactory:IDAL.IDBSessionFactory(数据仓储工厂在数据层实例化)代码如下:
public class DBsessionFactory:IDAL.IDBSessionFactory
{
public IDAL.IDBSession GetDBSession()
{
return new DBSession();// DBSession对象是DBSessionExtension.tt模版生成的 对象
}
===========================================================================================================》
IDAL
IDBSessionFactory:实际是调用了IDBSessionExtension.tt生成的IDBSession便捷接口属性。
public interface IDBSessionFactory
{
IDAL.IDBSession GetDBSession();
}
========================================================================
生成:
表现层:只添加了控制器层,控制器只添加了业务接口层(IBLL);那BLLA层,BLLB层都不会带到mvcweb网站bin目录下面,
所以需要手动的指定BLLA,BLLB,IBLL各层生成的路径(属性,生成,输入路径:..\MVCOA\bin\)
数据层:DALMSSQL,DALMYSQL,IDAL各层也要指定生产路径:(属性,生成,输入路径:..\MVCOA\bin\)
这样网站的bin目录各个接口就都有了,这样就比较保险。
===============================================================================================
web.cofing
<!--数据层DALMSSQL.DBSessionFactory类在DALMSSQL.dll程序集中-->
<add key="DBSessionFatoryDLL" value="DALMSSQL.DBSessionFactory"/>
<!--程序集DALMSSQL.dll中有:DBSessionFactory.cs类-->
<add key="DBSessionFatoryDLL" value="D:\1.vs2012新练习小小项目\MVCOA20170223\MVCOA\bin\DALMSSQL.dll"/
===========关于ef工厂线程存储上下文================================================================
1.定义了IBaseDAL数据父接口,就是约束数据层父类的。数据父类DaseDAL<T>:IDAL.IBaseDAL<T>where T:class,new()
主要有增删改查。都依赖于ef;就要有ef上下文。
2 .使用工厂线程存储ef上下文:
(使用线程存储EF上下文和数据仓储)
using System.Runtime.Remoting.Messaging;//运行时远程消息传递 ;程序集作用:一个线程访问另外一个线程里数据,不同程序之间可以互换数据。相互交互。
代码如下:
public class DBContextFactory:IDAL.IDBContextFactory
{
public DbContext GetDbContext()//创建EF上下文对象,在线程中共享一个上下文对象
{
// 从当前线程中 获取ef上下文对象
DbContext dbContext = CallContext.GetData(typeof(DBContextFactory).Name) as DbContext;//取数据
{
if (dbContext == null)//如果是null就是没取出来
{
dbContext = new MODEL.OuOAEntities();//那就实例化
CallContext.SetData(typeof(DBContextFactory).Name, dbContext);//new完后放回线程
}
return dbContext;
}
}
}
同样在数据BaseDAL<T>父类里面通过线程DBContextFactory工厂拿到数据,达到线程共用。
代码: DbContext db=new DBContextFactory().GetDbContext();
==================================================================================================
3.DBSession仓储跟上面2也都使用了工厂,也是一样的道理:
(使用线程存储EF上下文和数据仓储)
using System.Runtime.Remoting.Messaging;//运行时远程消息传递 ;程序集作用:一个线程访问另外一个线程里数据,不同程序之间可以互换数据。相互交互。
代码如下:
public class DBSeesonFactory:IDAL.IDBSessionFactory
{
public IDAL.IDBSession GetDbSession()//创建EF上下文对象,在线程中共享一个上下文对象
{
// 从当前线程中 获取DbSession仓储数据对象
IDAL.IDBSession dbSession = CallContext.GetData(typeof(DBContextFactory).Name) as DbSession;//取数据
{
if (dbSession == null)//如果是null就是没取出来
{
dbSession = new DBSession();//那就实例化
CallContext.SetData(typeof(DBContextFactory).Name, dbContext);//new完后放回线程
}
return dbSession;
}
}
}
====================2013.1.28==================
真真的做开发还会要做分区
复习:
表现层:UI Web,Controller
业务接口层:IBLL
业务实现:DALA,DALB
数据接口层IDL:IDBSession,IDBsessionFactory
数据层DBSession:IDAL.IDBSession
数据层(工厂实例化DBSession)DBsessionFactory:IDAL.IDBSessionFactory
IDBSessionFacory:接口调用IDA.IDBSession对象属性IDBSession方法(t4生成方法属性)。
DBContextFactory:IDAL.IDAContexFactory;从当前线程中 获取 上下文对象(上下文工厂)。如果没有获取到EF上下文对象,从新创建ef上下文对象,然后存入线程。
业务层父类BaseBLL<T>:IBLL.IBaseBLL<T> where T:class,new()
public BaseBLL()
{
IDbSession.IOu_UserInfoDAL.GetListBy(u=>u.uId==3);//业务层直接操作表,感觉很爽
}
不齐唱使用业务父类中直接使用BaseBLL<T>,父类写成abstract抽象了。强制你写业务层的子类(BLL.tt生成的),同时业务子类继承了:BaseBLL<MODEL.Bill_Leave>,IBLL.IBill_LeaveBLL
重点:在业务父类BaseBLL<T>接口里,
数据层接口等待实例化protected IDAL.IBaseDAL<T> idal;
通过仓储属性public IDAL.IDBSession DBSession{get}反射实例化数据接口。
============扩展业务登陆===============================================================================================
2.如果想扩展IOu_UserInfoDAL登陆方法
1.方便管理在IDAL层新建文件名称ExtensionIDAL;
2.添加接口IOu_UserInfoDAL;
3.在数据层DALMSSQL层,找到DAL模板,找到IDAL.IOu_UserInfoDAL接口实现登陆方法。(要为数据层的子类实现接口登陆方法)。
4.微软提供了巧秒的办法(partial)分布类接口,所以在ExtensionIDAL文件在添加接口。
5.同名的,同命名空间哦。(去掉命名空间.ExtensionIDAL,访问修饰加public partial)
6.登录:public partial IOu_UserInfoDAL
{
MODEL.Ou_UserInfo Login(string loginName);//根据用户名loginName查到,返回到用户实体 MODEL.Ou_UserInfo。
}
7.但是也不能直接在数据层DAL模板接口实现,因为是T4生成的;
8.在数据层DALMSSQL层:新建文件名称ExtensionDAL,添加类Ou_UserInfoDAL:IOu_UserInfoDAL接口登陆方法;
9.登陆方法代码:public MODEL.Ou_UserInfo Login(string loginName){base.GetListBy(u => u.uLoginName == LoginName).FirstOrDefault();}
===========================================================================================================================================
02.使用Spring.Net创建
项目中直接用
那些地方用到工厂:表现层调用业务接口层需要实例化,业务层调用数据接口数据层就要实现化,典型的需要工厂实例化的地方;
1.工厂不用去自己实例化,现在用Spring.net,Sping.Net相当于大的容器,大工厂;
最大的两个功能:1.工厂做为大工厂,反射工厂2.做为代理,大代理。
2.表现层控制器 pulic class HomeCotroller:Cotroller{
public ActionResult Index(){
IBLL.Iou_PermissionBLL bll=null;//表现层要实现接口,用Spring.Net实现。Spring.Net帮我们去配置文件,
找程序集,帮我们反射的方式创建程序集对应类的对象。
3.项目左键属性打开项目文件,新件文件下libs,分别拷贝SPring.Net(Common.Logging.dll,Spring.Core.dll,spring-objects-1.3)到libs文件。
spring-objects-1.3用途:提示功能。
4.DI层 添加SPring.Net程序集:Common.Logging.dll,Spring.Core.dll 。
5.怎么用?第一是写配置文件。打开UI里Web.config配置文件
03.添加业务仓储
1.调用业务层某一个对象时,都要通过ef创建下,才可以用,很不好。如代码: IBLL.IOu_PermissionBLL bll = DI.SpringHelper.GetObject<IBLL.IOu_PermissionBLL>("BLLs");//传配置文件里的id,BLLs
缺点是每一个业务都要去配置下。
2.在业务IBLL类中创建业务仓储IBLLSession类.复制IDBSessionExtension.tt模板到IBLL,生成IBLLSession接口操作属性。
3.BLLA里新建BLLSession类(业务仓储), 拷贝DAL层下MSSQLDBSessionExtension.tt模版过来,命名空间改BLLA和类名BLLSession:IBLL.IBLLSession;
t4生成对象时是业务层BLLA层下BLL.tt业务对象。
public I<#=entity.Name#>BLL I<#=entity.Name#>BLL
{
get
{
if(i<#=entity.Name#>BLL==null)
i<#=entity.Name#>BLL= new <#=entity.Name#>();//业务层对象,不要I,不要BLL
return i<#=entity.Name#>BLL;
}
set
{
i<#=entity.Name#>BLL= value;
}
}
例如: public partial class Bill_Leave : BaseBLL<MODEL.Bill_Leave>,IBLL.IBill_LeaveBLL
{
public override void SetDAL()
{
idal=DBSession.IBill_LeaveDAL;
}
}
===4.添加表现层操作上下文============================
1.在ui.web中添加程序集:MVCOA.Helper.
2.添加操作类:OperateContext,DI,IBLL添加进来。
3. 业务仓储IBLL.IBLLSession ibllSession需要实例化;例如:IBLL.IBLLSession ibllSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession");
4.MVCOA.Logic直接把程序集:MVCOA.Helper添加进来。
5.测试权限表数据,Home控制器
public ActionResult Index()
{
//1.通过业务接口 查询数据(通过spring.Net工厂)
// IBLL.IOu_PermissionBLL bll = DI.SpringHelper.GetObject<IBLL.IOu_PermissionBLL>("BLLs");//传配置文件里的id,BLL
//1.调用业务层 对象 获取 权限集合
List<MODEL.Ou_Permission> list = MVCOA.Helper.OperateContext.bllSession.IOu_PermissionBLL.GetListBy(p => p.pIsDel == false);
//2.加载视图(查询到上下文数据)
return View(list);
}
===5.复习整套流程==

浙公网安备 33010602011771号