工厂与泛型

在采用三层架构进行开发的过程中,我们通常会用到工厂。在表示层中通过它来创建不同的业务实例,再

去调用方法。假设我们项目中存已下几层:业务接口层,业务层(实现实务接口),业务工厂层,数据访

问层,通用方法层,表示层等。如果业务很多,我们定义了很多的不同的接口,在不用泛型的业务工厂类

里,我们通常需要针对不同的业务接口,编写不同的返回业务接口对象(已被实现)的方法。
例如:     
 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文件中插入纪

录就行。
也许你还有更好的方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值