N层架构实现的一个小例子
主要用到了[单例,抽象工厂,缓存,N层,反射]等知识。架构图如下:
解决方案用到的项目列表如下:
- 在接口项目中,定义一个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层架构实现的一个小例子的更多相关文章
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- 使用Trinity拼接以及分析差异表达一个小例子
使用Trinity拼接以及分析差异表达一个小例子 2017-06-12 09:42:47 293 0 0 Trinity 将测序数据分为许多独立的de Brujin grap ...
- 从一个小例子认识SQL游标
1 什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...
- 关于SVN配置文件的一个小例子
1 背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...
- Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期
学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...
- Hibernate入门1 - Hibernate概述及第一个小例子
一.什么是ORM? ORM,即Object Relational Mapping.我们知道,利用面向对象的思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是需要编写与底层数据库相关的 ...
- Spring和Hibernate结合的一个小例子
1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...
随机推荐
- CCF考试真题题解
CCF考试认证:题解参考博客http://blog.csdn.net/u014578266/article/details/45221841 问题描述 试题编号: - 试题名称: 图像旋转 时间限制: ...
- updating the chroot
Ubuntu may stop working after a Chrome OS update. If that's the case, update all the installed targe ...
- shell编程之服务脚本编写,文件锁以及信号捕获
shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...
- Android Studio 如何使用jni
在project视图下,main文件夹下,创建jniLibs文件夹,然后把so文件放入即可:
- PHP上传文件详解
1.上传文件使用的提交方式和请求Content-type POST提交方式,原始的form表单提交请加上enctype="multipart/form-data" 2.MAX_FI ...
- PopUpManager弹出窗口
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- mxml日期显示使用
mxml代码: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx= ...
- redis配置密码认证
redis配置密码 1.通过配置文件进行配置yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 ? 1 #requirepass foobared 去掉行前的注 ...
- libevent在windows下使用步骤详解
一 环境 官方下载地址:http://libevent.org/版本:libevent-2.0.22-stable 二 编译静态库 1 解压把上面下载到libevent-2.0.22-stable.t ...
- UITableView使用中的一些刁专问题总结
tableview中cell的系统分隔线问题(分隔线顶满或者缩短) //tableview代理方法,设置系统cell的分隔线 -(void)tableView:(UITableView *)table ...