导航

有关泛型和模式

Posted on 2009-04-21 18:21  Eric Wang  阅读(1998)  评论(4)    收藏  举报

仿Petshop4.0的架构,在实体层使用了ORM框架Nhibernate

封装NH对业务对象的访问如下:

        /// <summary>
        /// 查询记录
        /// </summary>
        /// <param name="hql">HQL语句</param>
        /// <param name="args">HQL语句中的参数值</param>
        /// <returns>IList<T></returns>
        public IList<T> Select<T>(string hql, Dictionary<string, object> args)
        {
            try
            {
                session = NHibernateDatabaseFactory.CreateSession();
                IQuery query = session.CreateQuery(hql);
                if (args != null)
                {
                    this.PrepareQuery(query, args);
                }
                return query.List<T>();
            }
            catch (Exception err)
            {
                throw err;
            }
        }

对业务对象的加载上,有两种方式。

方式一:

实体层:在BaseDAL类中定义通用的泛型访问方法

        public statci IList<T> GetData<T>(string hql)

        {

            return new NHUtility.NHibernateHelper().Select<T>(hql);

        }

业务层访问:

如Employee业务层:

        public List<EmployeeInfo> GetData()

        {

         List<EmployeeInfo> emps = (List<EmployeeInfo>)BaseDAL.GetData<EmployeeInfo>("From Employee E");

        }

这种方式,每个业务对象都要在业务层实现GetData方法。

方式二:

实体层:BaseDAL定义GetData ()模板方法 BaseInfo为所有业务对象的基类

public IList<BaseInfo> GetData ()

        {

           String hql = InitHQL ();

            return new NHUtility.NHibernateHelper().Select< BaseInfo >(hql);

        }

             protected abstract string InitHQL()

        {

         }

在EmployeeDAL子类中实现InitHQL方法:

        protected override string InitHQL()

        {

              return "From Employee E";

        }

    这种方式,每个业务对象都要定义实体类,并重载InitHQL方法。

业务层调用:   

通过反射+配置文件(或者DALFactory)调用DAL层,

<appSettings>
    
<add key="DAL" value=" SQLServerDAL "/>
</appSettings>

{

            string path = ConfigurationManager.AppSettings["DAL"];

            string fullyQualifiedClass = path + "." + Key + "DAL";

            BaseDAL dal = (BaseDAL)Assembly.Load(path).CreateInstance(fullyQualifiedClass);

            List<BaseInfo> data = dal.GetData();

}

 

方式一感觉比较简单,但业务层很难应用工程模式,

方式二可以应用工厂模式,但比较复杂,哪种方式更好呢?