【三层转七层】——起航篇

【背景】

    三层的学习拖了好久,出于对七层的无知,迟迟不肯进行七层的学习,看着今目标上项目时间又要到期,奈何该来的总是会来的,该学的总是要学的,不能再给自己创造一个继续拖拉的温床,始终相信一分耕耘一分收获,如果不去做,一切梦想就都是幻想,脚踏实地,改变坏习惯,从现在开始,下面就来进行三层转七层吧!

【三层回顾】

    三层是指界面层(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 !

     不足之处,希望路过的你多多指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值