讨论:关于OOP中类属性的延迟加载
OOP中类属性的延迟加载,这样听起来挺费解的,先看看下面的说明。
假设有两个自定义类型A和B,用以下代码表示A与B一对一的关联关系:
用以下代码表示A与B一对多的关联关系:
正常情况下,加载类A的对象时会一起加载属性B/BList的数据(PetShop 4.0是这么做的),所谓“类属性的延迟加载”就是指加载类A的对象时不加载属性B/BList的数据,而是当属性B/BList被访问是才加载相关数据。
解释清楚了什么是“类属性的延迟加载”之后就可以讨论如何实现的问题了(这里讨论一下基于下图程序结构的实现方法)。

上图是仿PetShop 4.0的结构设计的,只是把工厂类DALFactory放到IDAL中了。PS: BLL引用Domain、IDAL;IDAL引用Domain;XMLDAL和AccessDAL引用Domain、IDAL;Web引用BLL、IDAL、Domain,了保证程序顺利运行,还需按配置文件复制AccessDAL或XMLDAL到Bin文件夹下。
不知道各位看贴的大侠对这种结构延迟加载的实现有什么看法?请一定回帖赐教,小弟在此谢过了!
---------------------------------------------------------------------------------------------
下面简单说说自己的实现方法(对于上图的结构,我没想到解决方法,所以只能稍微修改了一下结构:把Domain里的实体类移到IDAL/Domain下,但保持原名称空间不变)。

PS:BLL引用IDAL;IDAL不需要引用;XMLDAL/AccessDAL引用IDAL;WEB引用BLL、IDAL,为了保证程序顺利运行,还需按配置文件复制AccessDAL或XMLDAL到Bin文件夹下。
CategoryInfo.cs中的部分代码:
真诚希望看贴的朋友积极参与讨论,给作为初学者的我提点建议,谢谢!
假设有两个自定义类型A和B,用以下代码表示A与B一对一的关联关系:
public class A
{
//
private B objB;
public B B { get { return objB; } }
}
public class B { //
}
{
//

private B objB;
public B B { get { return objB; } }
}
public class B { //
}用以下代码表示A与B一对多的关联关系:
public class A
{
//
private IList<B> objBList;
public IList<B> BList { get { return objBList; } }
}
public class B { // ... }
{
//
private IList<B> objBList;
public IList<B> BList { get { return objBList; } }
}
public class B { // ... }
正常情况下,加载类A的对象时会一起加载属性B/BList的数据(PetShop 4.0是这么做的),所谓“类属性的延迟加载”就是指加载类A的对象时不加载属性B/BList的数据,而是当属性B/BList被访问是才加载相关数据。
解释清楚了什么是“类属性的延迟加载”之后就可以讨论如何实现的问题了(这里讨论一下基于下图程序结构的实现方法)。
上图是仿PetShop 4.0的结构设计的,只是把工厂类DALFactory放到IDAL中了。PS: BLL引用Domain、IDAL;IDAL引用Domain;XMLDAL和AccessDAL引用Domain、IDAL;Web引用BLL、IDAL、Domain,了保证程序顺利运行,还需按配置文件复制AccessDAL或XMLDAL到Bin文件夹下。
不知道各位看贴的大侠对这种结构延迟加载的实现有什么看法?请一定回帖赐教,小弟在此谢过了!
---------------------------------------------------------------------------------------------
下面简单说说自己的实现方法(对于上图的结构,我没想到解决方法,所以只能稍微修改了一下结构:把Domain里的实体类移到IDAL/Domain下,但保持原名称空间不变)。
PS:BLL引用IDAL;IDAL不需要引用;XMLDAL/AccessDAL引用IDAL;WEB引用BLL、IDAL,为了保证程序顺利运行,还需按配置文件复制AccessDAL或XMLDAL到Bin文件夹下。
CategoryInfo.cs中的部分代码:
private CategoryInfo objParentCategoryInfo;
/// <summary>
/// 父类
/// </summary>
public CategoryInfo ParentCategoryInfo
{
get
{
if (objParentCategoryInfo == null)
{
objParentCategoryInfo = DALFactory.GetCategoryDAL().GetParentCategory(this);
}
return objParentCategoryInfo;
}
set
{
objParentCategoryInfo = value;
}
}
/// <summary>
/// 父类
/// </summary>
public CategoryInfo ParentCategoryInfo
{
get
{
if (objParentCategoryInfo == null)
{
objParentCategoryInfo = DALFactory.GetCategoryDAL().GetParentCategory(this);
}
return objParentCategoryInfo;
}
set
{
objParentCategoryInfo = value;
}
}
真诚希望看贴的朋友积极参与讨论,给作为初学者的我提点建议,谢谢!
浙公网安备 33010602011771号