C#复合模式与数据库访问
假设我有一个复合类C#复合模式与数据库访问,c#,composite,C#,Composite,假设我有一个复合类PharmaProduct(表示制药公司的产品层次结构)和一个数据库表。我想到了两种方法将数据加载到PharmaProduct对象中 (1) 在实例化对象时构造整个对象树。对树进行更改,并通过对树应用递归循环来持久化这些更改(这实际上是C#DataSet的工作方式) (2) 加载一个节点。仅在以下情况下加载其他节点: PharmaProduct GetParent() 或者 List GetChldren() 调用(实际执行直接数据库访问)。对节点进行更改。只保存该节点 这
PharmaProduct
(表示制药公司的产品层次结构)和一个数据库表。我想到了两种方法将数据加载到PharmaProduct
对象中
(1) 在实例化对象时构造整个对象树。对树进行更改,并通过对树应用递归循环来持久化这些更改(这实际上是C#DataSet
的工作方式)
(2) 加载一个节点。仅在以下情况下加载其他节点:
PharmaProduct GetParent()
或者
List GetChldren()
调用(实际执行直接数据库访问)。对节点进行更改。只保存该节点
这种类型的表可能有一千个条目,这取决于制药公司生产的产品类型。因此,在这种情况下,我认为第一种方法会太笨拙(而且会消耗内存)
如果出现任何组合模式问题,我应该如何实际访问数据库?看看
代理模式。使用它,您可以将PharmaProductProxy
对象放在树中,这些对象具有与PharmaProduct
相同的接口,但在访问它们时会延迟加载它们自己。查看代理模式。使用它,您可以将PharmaProductProxy
对象放在树中,这些对象具有与PharmaProduct
相同的接口,但在访问它们时会延迟加载它们自己。然后这就变成了一个CompositeProxy模式。是这样吗?请注意,根据数据库访问技术的不同,产品附带了延迟加载。以NHibernate为例,将您的“GetChildren”设置为虚拟,返回IList,您应该立即获得一个延迟加载的代理。@JMSA,模式经常一起工作——我从来没有听过这样的说法,但如果有人这样做,我会知道它们的意思。通常,您会说“我正在使用Composite with Proxy延迟加载部件”,然后这就变成了CompositeProxy模式。是这样吗?请注意,根据数据库访问技术的不同,产品附带了延迟加载。以NHibernate为例,将您的“GetChildren”设置为虚拟,返回IList,您应该立即获得一个延迟加载的代理。@JMSA,模式经常一起工作——我从来没有听过这样的说法,但如果有人这样做,我会知道它们的意思。通常,您会说“我正在使用带代理的组合来延迟加载部件”
List<PharmaProduct> GetChldren()