你的位置:首页 > ASP.net教程

[ASP.net教程]24、ASP.NET MVC入门到精通——数据库仓储


本系列目录:ASP.NET MVC4入门到精通系列目录汇总

业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用。

1、在IDAL项目中,新建IDBSession.tt模板

<#@ template language="C#" debug="false" hostspecific="true"#><#@ include file="EF.Utility.CS.ttinclude"#><#@ output extension=".cs"#> <#CodeGenerationTools code = new CodeGenerationTools(this);MetadataLoader loader = new MetadataLoader(this);CodeRegion region = new CodeRegion(this, 1);MetadataTools ef = new MetadataTools(this);string inputFile = @"..\MODEL\OA.edmx";EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);string namespaceName = code.VsNamespaceSuggestion();EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);#>using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace IDAL{public partial interface IDBSession{<#  // Emit Entity Typesforeach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)){#>  I<#=entity.Name#>DAL I<#=entity.Name#>DAL{get;set;}<#}#>}}

View Code

Ctrl+S后自动生成IDBSession接口

 using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace IDAL{public partial interface IDBSession{  IBill_LeaveDAL IBill_LeaveDAL{get;set;}  IoldWF_AutoTransactNodeDAL IoldWF_AutoTransactNodeDAL{get;set;}  IoldWF_BillFlowNodeDAL IoldWF_BillFlowNodeDAL{get;set;}  IoldWF_BillFlowNodeRemarkDAL IoldWF_BillFlowNodeRemarkDAL{get;set;}  IoldWF_BillStateDAL IoldWF_BillStateDAL{get;set;}  IoldWF_NodeDAL IoldWF_NodeDAL{get;set;}  IoldWF_NodeStateDAL IoldWF_NodeStateDAL{get;set;}  IoldWF_WorkFlowDAL IoldWF_WorkFlowDAL{get;set;}  IoldWF_WorkFlowNodeDAL IoldWF_WorkFlowNodeDAL{get;set;}  IOu_DepartmentDAL IOu_DepartmentDAL{get;set;}  IOu_PermissionDAL IOu_PermissionDAL{get;set;}  IOu_RoleDAL IOu_RoleDAL{get;set;}  IOu_RolePermissionDAL IOu_RolePermissionDAL{get;set;}  IOu_UserInfoDAL IOu_UserInfoDAL{get;set;}  IOu_UserRoleDAL IOu_UserRoleDAL{get;set;}  IOu_UserVipPermissionDAL IOu_UserVipPermissionDAL{get;set;}  IW_WorkFlowDAL IW_WorkFlowDAL{get;set;}  IW_WorkFlowBranchDAL IW_WorkFlowBranchDAL{get;set;}  IW_WorkFlowNodeDAL IW_WorkFlowNodeDAL{get;set;}  IW_WrokFlowRoleDAL IW_WrokFlowRoleDAL{get;set;}  IWR_WorkFlowApplyDAL IWR_WorkFlowApplyDAL{get;set;}  IWR_WrokFlowApplyDetailsDAL IWR_WrokFlowApplyDetailsDAL{get;set;}}}

View Code

2、在DAL项目中实现IDBSession接口

新建DBSession.tt模板

<#@ template language="C#" debug="false" hostspecific="true"#><#@ include file="EF.Utility.CS.ttinclude"#><#@ output extension=".cs"#> <#CodeGenerationTools code = new CodeGenerationTools(this);MetadataLoader loader = new MetadataLoader(this);CodeRegion region = new CodeRegion(this, 1);MetadataTools ef = new MetadataTools(this);string inputFile = @"..\MODEL\OA.edmx";EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);string namespaceName = code.VsNamespaceSuggestion();EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);#>using System;using System.Collections.Generic;using System.Linq;using System.Text;using IDAL;namespace DAL{public partial class DBSession:IDBSession{<#int index=0;  // Emit Entity Typesforeach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)){index++;#>  #region <#=index #> 数据接口 I<#=entity.Name#>DAL  I<#=entity.Name#>DAL i<#=entity.Name#>DAL; public I<#=entity.Name#>DAL I<#=entity.Name#>DAL{  get  {  if(i<#=entity.Name#>DAL==null)   i<#=entity.Name#>DAL=new <#=entity.Name#>DAL();   return i<#=entity.Name#>DAL;  }  set  {  i<#=entity.Name#>DAL=value;  }  }  #endregion<#}#>}}

View Code

Ctrl+S后自动生成DBSession类

 using System;using System.Collections.Generic;using System.Linq;using System.Text;using IDAL;namespace DAL{public partial class DBSession:IDBSession{  #region 1 数据接口 IBill_LeaveDAL  IBill_LeaveDAL iBill_LeaveDAL; public IBill_LeaveDAL IBill_LeaveDAL{  get  {  if(iBill_LeaveDAL==null)   iBill_LeaveDAL=new Bill_LeaveDAL();   return iBill_LeaveDAL;  }  set  {  iBill_LeaveDAL=value;  }  }  #endregion  #region 2 数据接口 IoldWF_AutoTransactNodeDAL  IoldWF_AutoTransactNodeDAL ioldWF_AutoTransactNodeDAL; public IoldWF_AutoTransactNodeDAL IoldWF_AutoTransactNodeDAL{  get  {  if(ioldWF_AutoTransactNodeDAL==null)   ioldWF_AutoTransactNodeDAL=new oldWF_AutoTransactNodeDAL();   return ioldWF_AutoTransactNodeDAL;  }  set  {  ioldWF_AutoTransactNodeDAL=value;  }  }  #endregion  #region 3 数据接口 IoldWF_BillFlowNodeDAL  IoldWF_BillFlowNodeDAL ioldWF_BillFlowNodeDAL; public IoldWF_BillFlowNodeDAL IoldWF_BillFlowNodeDAL{  get  {  if(ioldWF_BillFlowNodeDAL==null)   ioldWF_BillFlowNodeDAL=new oldWF_BillFlowNodeDAL();   return ioldWF_BillFlowNodeDAL;  }  set  {  ioldWF_BillFlowNodeDAL=value;  }  }  #endregion  #region 4 数据接口 IoldWF_BillFlowNodeRemarkDAL  IoldWF_BillFlowNodeRemarkDAL ioldWF_BillFlowNodeRemarkDAL; public IoldWF_BillFlowNodeRemarkDAL IoldWF_BillFlowNodeRemarkDAL{  get  {  if(ioldWF_BillFlowNodeRemarkDAL==null)   ioldWF_BillFlowNodeRemarkDAL=new oldWF_BillFlowNodeRemarkDAL();   return ioldWF_BillFlowNodeRemarkDAL;  }  set  {  ioldWF_BillFlowNodeRemarkDAL=value;  }  }  #endregion  #region 5 数据接口 IoldWF_BillStateDAL  IoldWF_BillStateDAL ioldWF_BillStateDAL; public IoldWF_BillStateDAL IoldWF_BillStateDAL{  get  {  if(ioldWF_BillStateDAL==null)   ioldWF_BillStateDAL=new oldWF_BillStateDAL();   return ioldWF_BillStateDAL;  }  set  {  ioldWF_BillStateDAL=value;  }  }  #endregion  #region 6 数据接口 IoldWF_NodeDAL  IoldWF_NodeDAL ioldWF_NodeDAL; public IoldWF_NodeDAL IoldWF_NodeDAL{  get  {  if(ioldWF_NodeDAL==null)   ioldWF_NodeDAL=new oldWF_NodeDAL();   return ioldWF_NodeDAL;  }  set  {  ioldWF_NodeDAL=value;  }  }  #endregion  #region 7 数据接口 IoldWF_NodeStateDAL  IoldWF_NodeStateDAL ioldWF_NodeStateDAL; public IoldWF_NodeStateDAL IoldWF_NodeStateDAL{  get  {  if(ioldWF_NodeStateDAL==null)   ioldWF_NodeStateDAL=new oldWF_NodeStateDAL();   return ioldWF_NodeStateDAL;  }  set  {  ioldWF_NodeStateDAL=value;  }  }  #endregion  #region 8 数据接口 IoldWF_WorkFlowDAL  IoldWF_WorkFlowDAL ioldWF_WorkFlowDAL; public IoldWF_WorkFlowDAL IoldWF_WorkFlowDAL{  get  {  if(ioldWF_WorkFlowDAL==null)   ioldWF_WorkFlowDAL=new oldWF_WorkFlowDAL();   return ioldWF_WorkFlowDAL;  }  set  {  ioldWF_WorkFlowDAL=value;  }  }  #endregion  #region 9 数据接口 IoldWF_WorkFlowNodeDAL  IoldWF_WorkFlowNodeDAL ioldWF_WorkFlowNodeDAL; public IoldWF_WorkFlowNodeDAL IoldWF_WorkFlowNodeDAL{  get  {  if(ioldWF_WorkFlowNodeDAL==null)   ioldWF_WorkFlowNodeDAL=new oldWF_WorkFlowNodeDAL();   return ioldWF_WorkFlowNodeDAL;  }  set  {  ioldWF_WorkFlowNodeDAL=value;  }  }  #endregion  #region 10 数据接口 IOu_DepartmentDAL  IOu_DepartmentDAL iOu_DepartmentDAL; public IOu_DepartmentDAL IOu_DepartmentDAL{  get  {  if(iOu_DepartmentDAL==null)   iOu_DepartmentDAL=new Ou_DepartmentDAL();   return iOu_DepartmentDAL;  }  set  {  iOu_DepartmentDAL=value;  }  }  #endregion  #region 11 数据接口 IOu_PermissionDAL  IOu_PermissionDAL iOu_PermissionDAL; public IOu_PermissionDAL IOu_PermissionDAL{  get  {  if(iOu_PermissionDAL==null)   iOu_PermissionDAL=new Ou_PermissionDAL();   return iOu_PermissionDAL;  }  set  {  iOu_PermissionDAL=value;  }  }  #endregion  #region 12 数据接口 IOu_RoleDAL  IOu_RoleDAL iOu_RoleDAL; public IOu_RoleDAL IOu_RoleDAL{  get  {  if(iOu_RoleDAL==null)   iOu_RoleDAL=new Ou_RoleDAL();   return iOu_RoleDAL;  }  set  {  iOu_RoleDAL=value;  }  }  #endregion  #region 13 数据接口 IOu_RolePermissionDAL  IOu_RolePermissionDAL iOu_RolePermissionDAL; public IOu_RolePermissionDAL IOu_RolePermissionDAL{  get  {  if(iOu_RolePermissionDAL==null)   iOu_RolePermissionDAL=new Ou_RolePermissionDAL();   return iOu_RolePermissionDAL;  }  set  {  iOu_RolePermissionDAL=value;  }  }  #endregion  #region 14 数据接口 IOu_UserInfoDAL  IOu_UserInfoDAL iOu_UserInfoDAL; public IOu_UserInfoDAL IOu_UserInfoDAL{  get  {  if(iOu_UserInfoDAL==null)   iOu_UserInfoDAL=new Ou_UserInfoDAL();   return iOu_UserInfoDAL;  }  set  {  iOu_UserInfoDAL=value;  }  }  #endregion  #region 15 数据接口 IOu_UserRoleDAL  IOu_UserRoleDAL iOu_UserRoleDAL; public IOu_UserRoleDAL IOu_UserRoleDAL{  get  {  if(iOu_UserRoleDAL==null)   iOu_UserRoleDAL=new Ou_UserRoleDAL();   return iOu_UserRoleDAL;  }  set  {  iOu_UserRoleDAL=value;  }  }  #endregion  #region 16 数据接口 IOu_UserVipPermissionDAL  IOu_UserVipPermissionDAL iOu_UserVipPermissionDAL; public IOu_UserVipPermissionDAL IOu_UserVipPermissionDAL{  get  {  if(iOu_UserVipPermissionDAL==null)   iOu_UserVipPermissionDAL=new Ou_UserVipPermissionDAL();   return iOu_UserVipPermissionDAL;  }  set  {  iOu_UserVipPermissionDAL=value;  }  }  #endregion  #region 17 数据接口 IW_WorkFlowDAL  IW_WorkFlowDAL iW_WorkFlowDAL; public IW_WorkFlowDAL IW_WorkFlowDAL{  get  {  if(iW_WorkFlowDAL==null)   iW_WorkFlowDAL=new W_WorkFlowDAL();   return iW_WorkFlowDAL;  }  set  {  iW_WorkFlowDAL=value;  }  }  #endregion  #region 18 数据接口 IW_WorkFlowBranchDAL  IW_WorkFlowBranchDAL iW_WorkFlowBranchDAL; public IW_WorkFlowBranchDAL IW_WorkFlowBranchDAL{  get  {  if(iW_WorkFlowBranchDAL==null)   iW_WorkFlowBranchDAL=new W_WorkFlowBranchDAL();   return iW_WorkFlowBranchDAL;  }  set  {  iW_WorkFlowBranchDAL=value;  }  }  #endregion  #region 19 数据接口 IW_WorkFlowNodeDAL  IW_WorkFlowNodeDAL iW_WorkFlowNodeDAL; public IW_WorkFlowNodeDAL IW_WorkFlowNodeDAL{  get  {  if(iW_WorkFlowNodeDAL==null)   iW_WorkFlowNodeDAL=new W_WorkFlowNodeDAL();   return iW_WorkFlowNodeDAL;  }  set  {  iW_WorkFlowNodeDAL=value;  }  }  #endregion  #region 20 数据接口 IW_WrokFlowRoleDAL  IW_WrokFlowRoleDAL iW_WrokFlowRoleDAL; public IW_WrokFlowRoleDAL IW_WrokFlowRoleDAL{  get  {  if(iW_WrokFlowRoleDAL==null)   iW_WrokFlowRoleDAL=new W_WrokFlowRoleDAL();   return iW_WrokFlowRoleDAL;  }  set  {  iW_WrokFlowRoleDAL=value;  }  }  #endregion  #region 21 数据接口 IWR_WorkFlowApplyDAL  IWR_WorkFlowApplyDAL iWR_WorkFlowApplyDAL; public IWR_WorkFlowApplyDAL IWR_WorkFlowApplyDAL{  get  {  if(iWR_WorkFlowApplyDAL==null)   iWR_WorkFlowApplyDAL=new WR_WorkFlowApplyDAL();   return iWR_WorkFlowApplyDAL;  }  set  {  iWR_WorkFlowApplyDAL=value;  }  }  #endregion  #region 22 数据接口 IWR_WrokFlowApplyDetailsDAL  IWR_WrokFlowApplyDetailsDAL iWR_WrokFlowApplyDetailsDAL; public IWR_WrokFlowApplyDetailsDAL IWR_WrokFlowApplyDetailsDAL{  get  {  if(iWR_WrokFlowApplyDetailsDAL==null)   iWR_WrokFlowApplyDetailsDAL=new WR_WrokFlowApplyDetailsDAL();   return iWR_WrokFlowApplyDetailsDAL;  }  set  {  iWR_WrokFlowApplyDetailsDAL=value;  }  }  #endregion}}

View Code

接下来,我们创建DBSession工厂和上下文工厂,目的是为了提高效率,在线程中共用一个对象。

3、IDAL项目中添加IDBSessionFactory接口

namespace IDAL{  /// <summary>  /// 数据仓储工厂  /// </summary>  public interface IDBSessionFactory  {    IDBSession GetDBSession();  }}

DAL项目中添加DBSessionFactory类继承IDBSessionFactory接口

using System.Runtime.Remoting.Messaging;using IDAL;namespace DAL{  public class DBSessionFactory : IDBSessionFactory  {    /// <summary>    /// 此方法的作用: 提高效率,在线程中 共用一个 DBSession 对象!    /// </summary>    /// <returns></returns>    public IDBSession GetDBSession()    {      //从当前线程中 获取 DBContext 数据仓储 对象      IDBSession dbSesion = CallContext.GetData(typeof(DBSessionFactory).Name) as DBSession;      if (dbSesion == null)      {        dbSesion = new DBSession();        CallContext.SetData(typeof(DBSessionFactory).Name, dbSesion);      }      return dbSesion;    }  }}

4、同样,我们再来创建一个上下文工厂,即便以后有多个数据库上下文,也能够很好的支持。

IDAL项目中,新建IDBContextFactory.cs接口

using System.Data.Entity;namespace IDAL{  /// <summary>  /// EF数据上下文 工厂  /// </summary>  public interface IDBContextFactory  {    /// <summary>    /// 获取 EF 上下文对象    /// </summary>    /// <returns></returns>    DbContext GetDbContext();  }

DAL项目中新建DBContextFactory类继承IDBContextFactory接口

using System.Data.Entity;using System.Runtime.Remoting.Messaging;using Model;namespace DAL{  public class DBContextFactory : IDBContextFactory  {    #region 创建 EF上下文 对象,在线程中共享 一个 上下文对象 + DbContext GetDbContext()    /// <summary>    /// 创建 EF上下文 对象,在线程中共享 一个 上下文对象    /// </summary>    /// <returns></returns>    public DbContext GetDbContext()    {      ////从当前线程中 获取 EF上下文对象      var dbContext = CallContext.GetData(typeof(DBContextFactory).Name) as DbContext;      if (dbContext == null)      {        dbContext = new OAEntities();        CallContext.SetData(typeof(DBContextFactory).Name, dbContext);      }      return dbContext;    }    #endregion  }}

5、Common项目中,添加ConfigurationHelper.cs来操作配置文件

using System;using System.Configuration;namespace Common{  public static class ConfigurationHelper  {    public static string AppSetting(string key)    {      return ConfigurationManager.AppSettings[key];    }  }}

Web.config中添加如下配置节点:

  <add key="DBSessionFatory" value="DAL.DBSessionFactory" />  <add key="DBSessionFatoryDLL" value="E:\WorkSpace\Study\Webs\MVC\OAsln\Web\bin\DAL.dll" />

6、修改BaseBLL类的调用方式,添加如下代码:

    /// <summary>    /// 2.0 数据仓储接口(相当于数据层工厂,可以创建所有的数据子类对象)    /// </summary>    private IDAL.IDBSession iDbSession;    #region 数据仓储 属性 + IDBSession DBSession    /// <summary>    /// 数据仓储 属性    /// </summary>    public IDAL.IDBSession DBSession    {      get      {        if (iDbSession == null)        {          //1.读取配置文件          string strFactoryDLL = Common.ConfigurationHelper.AppSetting("DBSessionFatoryDLL");          string strFactoryType = Common.ConfigurationHelper.AppSetting("DBSessionFatory");          //2.1通过反射创建 DBSessionFactory 工厂对象          Assembly dalDLL = Assembly.LoadFrom(strFactoryDLL);          Type typeDBSessionFatory = dalDLL.GetType(strFactoryType);          IDAL.IDBSessionFactory sessionFactory = Activator.CreateInstance(typeDBSessionFatory) as IDAL.IDBSessionFactory;          //2.2根据配置文件内容 使用 DI层里的Spring.Net 创建 DBSessionFactory 工厂对象          //3.通过 工厂 创建 DBSession对象          iDbSession = sessionFactory.GetDBSession();        }        return iDbSession;      }    }    #endregion

 在这里,使用到了工厂来创建对象,后面引入了Spring.net之后,会回过头来优化现有的代码。项目中使用到了许多接口,目的是为了解耦,每一个项目的职责尽量让其单一,业务层只让其调用数据层接口,也是为了依赖于抽象,而不是具体。每一个框架其实都是各种设计模式的一个集合,设计模式是为了解决一类问题,而框架就是为了解决一系列问题了。到现在为止,整个项目的雏形已经出来了,但是后续,我们一步一步来优化,好的框架不是一下子就能设计得完美的,而是能够不断的拥抱修改,可持续扩展,不断改进出来的。