• 我的MVC数据层(DAL)写法
  • 暖风 发表于 2015/12/14 17:31:00 | 分类标签: MVC学习 MVC模型 三层架构
  •  业务层调用数据层对象,我不想每次都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 Types
    foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
    {
    #>
       I<#=entity.Name#>DAL I<#=entity.Name#>DAL{get;set;}
    <#}#>
    }
    }

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

    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 Types
    foreach (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
    
    <#}#>
    }
    }

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

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

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:暖风
  • 加入时间:2013/5/17 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮