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

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

 

Ctrl+S后自动生成IDBSession接口

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

新建DBSession.tt模板

Ctrl+S后自动生成DBSession类

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

ASP.NET MVC入门到精通——数据库仓储的更多相关文章

  1. 24、ASP.NET MVC入门到精通——数据库仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDB ...

  2. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  3. 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...

  4. 22、ASP.NET MVC入门到精通——搭建项目框架

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 前面的章节,说了ASP.NET MVC项目中常用的一些技术和知识点,更多的是理论上面的东西,接下来,我将通过一个简单的OA项目来应用我们之前 ...

  5. 5、ASP.NET MVC入门到精通——NHibernate代码映射

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一篇NHibernate学习笔记—使用 NHibernate构建一个ASP.NET MVC应用程序 使用的是xml进行orm映射,那么这一 ...

  6. 6、ASP.NET MVC入门到精通——ASP.Net的两种开发方式

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 目前,ASP.NET中两种主流的开发方式是:ASP.NET Webform和ASP.NET MVC.从下图可以看到ASP.NET WebFo ...

  7. 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...

  8. 20、ASP.NET MVC入门到精通——WebAPI

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 微软有了Webservice和WCF,为什么还要有WebAPI? 用过WCF的人应该都清楚,面对那一大堆复杂的配置文件,有时候一出问题,真的 ...

  9. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

随机推荐

  1. 关于1KB病毒的清除

    以前中过很多次的1KB病毒,这种病毒来源一般都是U盘,就是去打印店插个U盘,回来插自己电脑发现U盘中毒了. 中毒特征就是根目录下的所有文件夹都变成快捷方式,都只有1KB大小,而根目录下的文件和压缩包不 ...

  2. IDEA 创建git 分支 拉取分支

        此时只是在本地创建好了分支,修改源代码后add,commit将本地分支提交到远程仓库          分支已创建,其它成员此时就可以从git拉分支

  3. (笔记)Mysql实例:建库建表并插入数据1

    drop database if exists school;  // 如果存在school则删除create database school;  // 建立库schooluse school;  / ...

  4. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  5. zend framework分析总结[转]

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/mayongzhan - 马永占,myz,may ...

  6. e823. 创建JSplitPane

    A split pane divides its space between two components. The split pane contains a divider that allows ...

  7. e618. Validating a JTextField When Permanently Losing the Focus

    This example demonstrates a text field that validates its contents when it receives a permanent focu ...

  8. Web打印控件Lodop实现证件套打

    第一次接触Lodop大概是在两年前了,那时候研究Lodop主要是为了验证它能不能实现打印时在不修改内容的前提下调整样式,结果是ok的,如今又一次接触它,是因为工作中需要使用它了,于是再一次碰面 Lod ...

  9. AMQ5540, AMQ5541 and AMQ5542, application did not supply a user ID and password, 2035 MQRC_NOT_AUTHORIZED

    Technote (troubleshooting) Problem(Abstract) As an MQ administrator you create a new queue manager i ...

  10. python2除法保留小数部分

    转载:http://www.cnblogs.com/yhleng/p/9223944.html 1.python2和python3除法的最大区别: python2: print 500/1000 py ...