主要用到了[单例,抽象工厂,缓存,N层,反射]等知识。架构图如下:

解决方案用到的项目列表如下:

  1. 在接口项目中,定义一个IUER接口。
namespace IDAL
{
public interface IUser
{
int Delete(string userId);
int Delete(Entity.User user);
}
}

2.在DALSQLProvider项目中,进行对IUSER接口的实现,针对SQL SERVER数据库。[Oracle同]

namespace DALSQLProvider
{
public class User : IDAL.IUser
{
#region IUser 成员 public int Delete(string id)
{
throw new NotImplementedException();//ADO.NET
} public int Delete(Entity.User user)
{
throw new NotImplementedException();//ADO.NET
} #endregion
}
}

3.DALFactory类库项目实现抽象出对所有接口(相当于一个系列),以后进行产品族选择配置(4)。

namespace DALFactory
{
public abstract class DalFactory
{
//一个系列,里面接口数量对应于IDAL中的接口
public abstract IDAL.IUser UserDALProvider
{
get;
}
}
}

4.DALSQLProvider项目对DALFactory类库项目进行实现,返回DALSQLProvider项目User类的实例[Orcale同]

namespace DALSQLProvider
{
public class UserDALSQLFactory : DALFactory.DalFactory
{
public override IDAL.IUser UserDALProvider
{
get
{
// return new User();
//添加缓存,避免每次都NEW对象。
DALSQLProvider.User obj = System.Web.HttpContext.Current.Cache.Get("IDAL.IUser") as DALSQLProvider.User;
if (obj == null)
{
var instance = new User();
System.Web.HttpContext.Current.Cache.Add("IDAL.IUser", instance, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
return instance;
}
return obj;
}
}
}
}

5.业务逻辑层实现数据访问层定义的接口。在这个地方用反射根据加载的程序集(DALSQLProvider.dll/DALOracleProvider.dll)进行实例化类。用单例保证不出现多个对象。

namespace BLL
{
public class DALProvider
{
private static DalFactory instance;
private DALProvider() { }
static DALProvider()
{
//根据WebConfig获取具体的provider
string dllFileName = System.Web.Configuration.WebConfigurationManager.AppSettings["DataProviderDllFile"];
string dalFactoryClassName = System.Web.Configuration.WebConfigurationManager.AppSettings["DataProviderFactoryName"]; System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFile(System.Web.HttpContext.Current.Server.MapPath("~/DataProvider/" + dllFileName));//把要加载的程序集放在项目的DataProvider目录下, instance = dll.CreateInstance(dalFactoryClassName) as DalFactory;
} public static DalFactory DefaulProvider
{
get
{
return instance;
}
}
}
}
namespace BLL
{
public class User
{
DalFactory provider = DALProvider.DefaulProvider; public int deleteUser(string id)
{
return provider.UserDALProvider.Delete(id);
}
}
}

6.业务逻辑在页面进行展现。

protected void Button1_Click(object sender, EventArgs e)
        {
            BLL.User u = new BLL.User();
            this.Button1.Text = u.deleteUser("1").ToString();
        }

N层架构实现的一个小例子的更多相关文章

  1. java连接mysql的一个小例子

    想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...

  2. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  3. MVVM模式的一个小例子

    使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...

  4. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  5. 从一个小例子认识SQL游标

    1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...

  6. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  7. Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

    学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...

  8. Hibernate入门1 - Hibernate概述及第一个小例子

    一.什么是ORM? ORM,即Object Relational Mapping.我们知道,利用面向对象的思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是需要编写与底层数据库相关的 ...

  9. Spring和Hibernate结合的一个小例子

    1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...

随机推荐

  1. unity3d继续尝试

    这一次完成了一些复杂的脚本,会了一些简单的鼠标事件,这样就能使用鼠标进行简单的交互了. 其实右边栏目上面一些奇怪的属性看的我是眼花缭乱. 也不知道干啥用的,还有就是真的很佩服里面的物理引擎确实简单易上 ...

  2. JAVA序列化与反序列化三种格式存取(默认格式、XML格式、JSON格式)

    什么是序列化 java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输.或者持久化存储到数据库或文件系统中:然后在需要的时候 ...

  3. Cv图像处理

    http://wiki.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86 看看知识点,虽然是C 版本.

  4. 修改index.php 清空mylog1.txt

    进入编辑php文件vim index.php(无则新建) -->进入命令行模式--输入a(append)-->进入编辑模式-->编辑好-->esc退出编辑模式-->:q! ...

  5. 第3章 Java语言基础----成员变量与局部变量

    在对局部变量进行赋值时,不能对非静态字段age进行静态引用,图1错误,加上static后图二正确,图3与图4类似,如下图所示: 图1图2 图3图4 2.成员变量times在类中定义,局部变量times ...

  6. 购物车(Shopping cart) —— B2C网站核心产品设计 (二)

    购物车是做什么的? 我们先来看一下现实超市中的购物车,一个带四个轱辘的铁筐子,客人推来推去,看到什么东西喜欢,就扔进去,觉得东西差不多了,就推到收银台. 那B2C网站中的购物车又是一个什么东西呢? 从 ...

  7. 贪心+bfs 或者 并查集 Codeforces Round #268 (Div. 2) D

    http://codeforces.com/contest/469/problem/D 题目大意: 给你一个长度为n数组,给你两个集合A.B,再给你两个数字a和b.A集合中的每一个数字x都也能在a集合 ...

  8. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  9. linux视频学习4(crontab和进程)

    1 . crontab定时任务: 任务调度: 系统在某个时间执行的特定的命令. 分类: 1.系统工作.2.个别的用户工作. 设置任务调度文件: /etc/crontab 1.crontab -e  : ...

  10. unity中的update、Lateupdate和FixedUpdate。

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...