仿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();
}
方式一感覺比較簡單,但業務層很難應用工程模式,
方式二可以應用工廠模式,但比較復雜,哪種方式更好呢?