在采用三层架构进行开发的过程中,我们通常会用到工厂。在表示层中通过它来创建不同的业务实例,再
去调用方法。假设我们项目中存已下几层:业务接口层,业务层(实现实务接口),业务工厂层,数据访
问层,通用方法层,表示层等。如果业务很多,我们定义了很多的不同的接口,在不用泛型的业务工厂类
里,我们通常需要针对不同的业务接口,编写不同的返回业务接口对象(已被实现)的方法。
例如:
private static readonly string AssemblyPath = ConfigurationManager.AppSettings
["DAL"];
#region CreateCategory
/// <summary>
/// 创建Product数据层接口
/// </summary>
public static Maticsoft.IDAL.Products.ICategory CreateCategory()
{
string classNamespace = AssemblyPath + ".Products.Category";
object objType = CreateObject(AssemblyPath, classNamespace);
return (Maticsoft.IDAL.Products.ICategory)objType;
}
#endregion
#region CreateProduct
/// <summary>
/// 创建Product数据层接口
/// </summary>
public static Maticsoft.IDAL.Products.IProduct CreateProduct()
{
string classNamespace = AssemblyPath + ".Products.Product";
object objType = CreateObject(AssemblyPath, classNamespace);
return (Maticsoft.IDAL.Products.IProduct)objType;
}
#endregion
.....
在这种方式下随着业务接口的增多,我们将在这里逐步增加对应的方法。
有没有一种方式能够实现在业务增多时,不改工厂的结构。
我的做法是这样的:通过泛型来实现。工厂里只需一个方法。既然
例如:
public static T CreateInstance<T>()
{
Type o_T = typeof (T);
string s_Name = o_T.FullName;
if (Maticsoft.Common.GlobalVariable.ClassRelation.Count == 0)
{
Maticsoft.Common.GlobalVariable.GetClassRelation();
}
string[] sa_AssembClass = (string[])
Maticsoft.Common.GlobalVariable.ClassRelation[s_Name];
string s_AssemblyPath = sa_AssembClass[0];
string s_ClassName = sa_AssembClass[1];
object obj = Assembly.Load(s_AssemblyPath).CreateInstance(s_AssemblyPath
+"."+ s_ClassName);
return (T) obj;
}
既然我们在调用此方法的时候只是传入一个对应的接口类型,那么如何得到需要实际创建的业务对象呢?
毕竟我们是不能直接实例化一个接口的。也就是如何得到接口与业务的程序集,以及具体的类之间的关系
,以便我们通过反射来创建具体的对象呢。这时我们可以将这三者的关系保存在一个XML文件或数据库表
中。
例如:
接口1的FullName /对应实现接口1的业务的程序集名称 /业务类的名称
Maticsoft.IDAL.Products.IProduct /Maticsoft.BLL.Products /Products
在我们的工厂方法里通过得到应的业务的接口全名,我们就可以得到其他两项,我上面采用的是存在数据
库表中,查出来后存在通用层的哈希表中,键为FullName,值为一个数组string[2].以静态变量的方法存
在通用层中,这样就可以避免得复去查数据库中的表。得到值后再通过反射既可创建实例了某接口的对象
实例。个人感觉很方便,下次再增加业务时,不需要改这个业务工厂了,只需往表中或XML文件中插入纪
录就行。
也许你还有更好的方法。