主要用到了[单例,抽象工厂,缓存,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. 第三十九节,python内置全局变量

    vars()查看内置全局变量 以字典方式返回内置全局变量 #!/usr/bin/env python # -*- coding:utf8 -*- print(vars()) #输出 # {'__bui ...

  2. kafka和flume的对比

    摘要: (1)kafka和flume都是日志系统.kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能.flume分为agent(数据采集器),collector(数据简单处理和 ...

  3. Lowest Bit

    Lowest Bit Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Su ...

  4. how to add a shared lib in C?

    http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html Basically, 2 steps: 1) make the ...

  5. PureMVC 框架总结收录

    PureMVC框架的目标很明确,就是把程序分为低耦合的三层:Model.View和Controller. 通过使用PureMVC后,我们的代码将集中分为以下几个部分:Façade.Command.Me ...

  6. mybatis 做 insert操作的时候返回插入的那条数据的id

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:吃丸子的小鹿链接:http://www.zhihu.com/question/20810321/answer/16843223 ...

  7. Qt之中文显示(QMessageBox、QLineEdit右键菜单等)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101art3.html 在编写Qt程序的时候,总会碰到中文问题,一直都很困惑,原本在使用QLineEdit的时候 ...

  8. c++模板两个数的加法

    1.最简单的情况: template<class T> T Add(const T& a, const T& b) { return a + b; } 缺点是不能够处理不同 ...

  9. sql/plus 常用操作

    一.sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1).sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户 ...

  10. html5利用websocket完成的推送功能

    利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0,一些东西是自己琢磨的,也不知道恰不恰当,不恰当处,还请各位见谅,并指出. 程序简单来说,就是客户A可以发送消息给客户 ...