三层的例子敲的差不多了,为了对抽象工厂有个更好的理解,开始对三层进行加工,下面来对三层进行逐步更新,首先是看一下我画的包图:
包图为大家从宏观上展示了程序各层之间的调用关系,现在用类图展示一下详细的调用关系:
通过包图和类图能够比较清晰的知道各个包之间的调用关系,通过时序,可以清晰的知道这些调用关系的顺序,我们在写代码的时候是从D层开始写的,当然没有那么绝对,只不过从D层出发,在写的过程中会有B层对D层的调用,有时候在写个层的时候需要先将大致的框架写出来。
下面通过时序图从U层开始,从用户角度,将这个程序的执行顺序表示出来:
下面看一下我设计的登录下例子:
在这个例子中我对sqlhelper有了更加深刻的理解,sqlhelper,是对所有sql语句(增删改查)的集合,因为在D层中会有很多类都会用到增删改查,而这些代码是重复的,这样会造成代码的冗余,于是就需要SQLHELPER来将这些方法总结一下,sqlhelper就是一些有关数据库的语句的有参、无参、有返回值、无返回值的函数的集合,当需要哪个函数的时候,我们只需要在D层调用这些方法,将自己需要的参数写进去就可以了,这样减少了代码重复。
而对于配置文件,在之前的博客中,我也提到过appsettings与connectstrings,为什么要用配置文件呢?一方面配置文件的使用可以减少源码的改动,只需要从txt文件中做改动就可以让程序的运行达到想要的效果,另一方面,它实现了解耦。
在这个程序中还用到了反射,在我的程序中是这样用的:
在工厂中用反射的时候首先要添加Reflection的引用,首先说明一下下面的代码:AssemblyName为程序集名,className为命名空间 .类名,一般情况程序集名和类名是一样的下,但是如果对命名空间名进行更改,你会发现生成的.dll的名称依旧是程序集名,所以就想问他俩有什么区别??
程序集就是一个项目,多个项目构成一个解决方案,是物理的,将生成EXE以后可以看到到它的名字是程序集.dll,是可以看到的,而命名空间就相当于windows中的一个文件夹,只是这个文件夹中放的不是文件,而是类,它是逻辑的,看不到。
using System.Reflection;
public class DataAccess
{
private static readonly string AssemblyName = "LoginDAL";
public IDAL.ISelectUser CreateSelectUser()
{
string className = AssemblyName + "." + "UserDAO";
return (ISelectUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public IUpdateScore CreateUpdateScore()
{
string className = AssemblyName + "." + "ScoreDAO";
return (IUpdateScore)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
关于三层,可以多多交流,还是理解的不够透彻,希望和大家分享!