【背景】
三层的学习拖了好久,出于对七层的无知,迟迟不肯进行七层的学习,看着今目标上项目时间又要到期,奈何该来的总是会来的,该学的总是要学的,不能再给自己创造一个继续拖拉的温床,始终相信一分耕耘一分收获,如果不去做,一切梦想就都是幻想,脚踏实地,改变坏习惯,从现在开始,下面就来进行三层转七层吧!
【三层回顾】
三层是指界面层(UI)、业务逻辑层(BLL)、数据访问层(DAL),UI层主要是提供给用户一个视觉上的界面,通过界面层,用户输入数据、获取数据。界面层同时也提供一定的安全性,确保用户不用看到不必要的机密信息;BLL层是界面层和数据访问层的桥梁,它响应界面层的用户请求,执行任务并从数据层抓取数据,并将必要的数据传送给界面层;DAL层数据层定义、维护数据的完整性、安全性,它响应逻辑层的请求,访问数据。这一层通常由大型的数据库服务器实现,如Oracle 、Sybase、MS SQl Server等。
一张图来说明三层架构:
【七层学习】
所说的七层就是在三层的基础上多加了两个设计模式,分别是外观模式和抽象工厂模式,外观层(Facade层)、工厂层(Factory)、接口层(IDAL),对三层的扩充,分的层多了,相互依赖性就少了,这就在向"高内聚低耦合"的程序设计方向靠拢,七层对于三层来说,帮助三层解决更加复杂的问题,在更加庞大,业务逻辑复杂的程序中应用较多。
一张包图,把握全局观
根据图来了解七层
Facade层:用来分离UI层和BLL层;
外观模式:为子系统中的一组接口提供一个统一的入口,定义了一个高层接口,这个接口使得这一子系统更加容易使用,通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
由于在外观类中维持了对子系统对象的引用,客户端可以通过外观类来间接调用子系统对象多个业务方法,而无须与子系统对象直接交互,引入外观类后,客户端代码变得非常简单,其典型代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">class program
{
static void Main(string[] args)
{
Facade facade = new Facade();
facade.Method();
}
}
</span>
Factory层:创建一个接口类层中的那个空方法类型的方法(这个行为叫……[空方法的实体化]),通过读取Config文件中的数据来控流数据库(调节是进入 那一个DAL层),将一个指定的DAL 层中的一个指定的类反射到接口层一个指定的接口类,所以工厂层返回的最终结果是一个接口类(DAL层因为数据库不同而产生分支,这里就是指定到某一个确定的分支)。工厂类的作用是将接口类中抽象方法的实体反射给接口,表现在将DAL类库中指定的类返回给相应的接口类对象。 。为了方便更换数据库,同时将DAL层中的类转换成IDAL层的接口。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
在实际应用开发中,可以对具体工厂的实例化过程进行改进,在客户端代码中不直接使用new关键字来创建工厂对象,而是将具体工厂类的类名存储在配置文件(例如XML文件)中,再通过程序集的反射机制,读取配置文件中存储的类名字符串生成对象。
反射+配置文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//导入命名空间
using system.Reflection;
object obj =Assembly.Load("程序集名称").CreateInstance("命名空间.类");</span>
客户端代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Configuration;
using System.Reflection;
namespace FactoyMethodSample
{
class Program
{
static void Main(string[] args)
{
LoggerFactory factory; //针对抽象工厂类编程
Logger logger; //针对抽象产品类编程
//读取配置文件
string factorystring = ConfigurationManager.AppSetting["factory"];
//反射生成对象
factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreatInstance(factoryString);
logger = factory.CreateLogger();
logger.WriteLog();
Console.Read();
}
}
}</span>
SqlHelper:SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。
【总结】
无论做什么事,不管熟悉还是不熟悉,不要被内心的恐惧所打倒,一切还没有开始,just do it !
不足之处,希望路过的你多多指教!