你的位置:首页 > ASP.net教程

[ASP.net教程]终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)


前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建。也不是很好。

现在想到使用抽象工厂的方式来实现这个:

我们在程序集中加上下面的代码:

<appSettings> <!--命名空间--> <add key="DALNameSpace" value="DAL"/> <!--程序集--> <add key="DALAssembly" value="DAL"/></appSettings>

然后新建一个抽象工厂类:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Reflection;using System.Configuration;using IDAL;namespace DALFactory{  public class DALAbstractFactory  {    /// <summary>    ///命名空间    /// </summary>    public static string DALNameSpace    {      get      {        return ConfigurationManager.AppSettings["DALNameSpace"];      }    }    /// <summary>    /// 程序集    /// </summary>    public static string DALAssembly    {      get      {        return ConfigurationManager.AppSettings["DALAssembly"];      }    }    public IClassDAL GetClassInstance()    {      string fullNameSpace = DALNameSpace + ".ClassDAL";     return CreateInstance(fullNameSpace, DALAssembly) as IDAL.IClassDAL;    }    /// <summary>    /// 创建实例    /// </summary>    /// <param name="fullClassNameSpace"></param>    /// <param name="assembly"></param>    public static object CreateInstance(string fullClassNameSpace,string assembly)    {     var DALAssembly= Assembly.Load(assembly);     return DALAssembly.CreateInstance(fullClassNameSpace);    }  }}

上面的方法,通过反射,创建DAL数据访问层的实例。

现在在业务层,我们可以这样:

using DAL;using Entity;using IDAL;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BLL{  public class ClassBLL  {    //耦合度太高    // ClassDAL dal = new ClassDAL();    //这种还是有耦合,业务层和数据访问层耦合度太高    //IClassDAL dal = new ClassDAL();    //引入简单工厂模式    //IClassDAL dal = DALFactory.DALFactory.GetClassInstance();    //引入抽象工厂     IClassDAL dal = DALFactory.DALAbstractFactory.GetClassInstance();    /// <summary>    /// 获取Class列表    /// </summary>    /// <returns></returns>    public List<ClassEntity> GetList()    {      return dal.GetList();    }  }}

效果图: