Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#复合模式与数据库访问_C#_Composite - Fatal编程技术网

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()