1

从业务对象中分离数据访问代码并不新鲜,但我一直在寻找实现某些功能的“最佳方式”。从业务对象中抽象出数据访问层

我有以下类:

橙色 - 这是我的业务对象。

OrangeList - 这是一个桔子列表。

用户将通过调用OrangeList.Fetch(someCriteria)从数据存储中获取Orange对象。因此,OrangeList必须具有对数据访问层的引用 - 因此它具有以下属性:IDataProvider MyDataProvider。

这对我很有用,但问题是我们无法单独获取一个橙色 - 我们总是需要通过OrangeList。

Orange或OrangeList中的一个或者两个都必须从某个可容纳DataProvider的公共对象中下降。

这是一个问题,还是我的方法在第一个地方脱颖而出?

任何提示/指针表示赞赏,谢谢。

编辑:根据下面的讨论,我检出了Repository模式。

但是,对于我的项目,我认为将Repository与DAL进一步分离是一个好主意。

因此....存储库是我如何获得橙子,并保存橙子,但仍然不知道如何。我将它委托给IDataProvider,它可以是图中列出的许多数据。

澄清 - Orange不知道如何获取/更新自己,对不对?这是一个纯粹的业务对象 - 这是重点吗?

alt text http://img22.imageshack.us/img22/2460/repositorya.jpg

如果你想知道,我的“LegacyDataProvider”是支持旧系统,它访问基于文件的数据库(FoxPro中,伊克) - 但这让我把这个包起来,并保持它从我的新代码开始。

在.NET程序集建设方面,以防止循环引用,它看起来像我要去有Repository.DLL [OrangeRepo],一个DataProviderInterface.DLL [IDataProvider]和BusinessObjects.dll [橙]。都好?

我有知道存储库的想法吗?

回答

2
+0

感谢你,虽然它看起来像我 - 我的OrangeList是存储库? – Duncan 2009-04-10 22:44:39

+0

你的OrangeList是OrangeRepository的方法,如 rep.GetOrange(Guid id); .GetOranges()等 或者看看Rob Conery的管道和过滤器方法http://www.asp.net/learn/mvc-videos/#MVCStorefrontStarterKit – Sebastian 2009-04-11 08:06:14

+0

好的,上面的编辑对我的问题有意义吗? – Duncan 2009-04-11 11:23:59

1

我(并)构成所有这些事情关闭主API对象(OrangeCart?),其也构成用于数据访问层的界面的对象。您的Orange和OrangeLists知道他们属于OrangeCart并与其通话以进行DAL操作。

+0

好的,所以你说甚至连OrangeList都没有DAL知识?相反,Orange AND OrangeList有一个Fetch方法,但是当它被调用时,它会调用OrangeCart.Fetch()? – Duncan 2009-04-10 22:58:59

+0

为什么不在OrangeCart中只有FetchOrange和FetchOrangeList的方法? 我觉得它更像一个工厂模式,只有工厂必须知道橙子(香肠)是如何构造的,以及其他人都知道要去工厂获取橙子的杂乱细节。 – 2009-04-10 23:35:05

0

而不是OrangeList(someCriteria),我会有Oranges.Criteria1List,Oranges.Criteria2List。对于一个单身人士,我会有Oranges.GetItem(orangeId)。

按照自己的方式,BusinessObject最终需要考虑逻辑数据设计术语而不是概念术语。 (存储库实现给我带来了同样的不舒服感 - 它们常常被用于在表上放置一个简化抽象粗代码层)我不喜欢BL需要了解数据库实现细节,如数据类型和大小。通常解耦这些类型的依赖关系是非常有用的。)

+0

le dorfier储存库的整个要点是将BL从这些细节中屏蔽掉。这个想法是让存储库隐藏特定数据结构与应用程序其余部分的映射。这也并不意味着它必须适用于数据库。当然,有很多没有这样做:(。 – eglasius 2009-04-10 23:58:02

相关问题