我正在开发一种更加面向对象的方法,以便在我正在开发的新系统中使用ASP.NET Web应用程序。
我有一个大多数人都会熟悉的共同结构。我有一个学校结构,有多个部门;属于单一部门的课程;和属于多门课程的学生。
在部门视图中,我列出了属于该部门的所有课程,我希望每门课程的汇总数据,如入学人数,提款人数,男/女人数等。
在个人课程视图中,我需要实际的学生名单及其详细信息,例如是否已注册,通过课程,性别等。
然后是个别学生视图,其中显示有关学生的所有详细信息,包括其他课程,地址等的注册。
以前,我会有一个数据访问层返回我在每种情况下需要的任何数据,并将其作为SQLDataReader
或DataSet
(在VB.NET中工作)返回。现在,我正在尝试使用面向对象的方法对此进行建模,我正在DAL中创建对象并将这些对象返回到BLL。当我需要在对象中聚合细节时,我不知道如何处理这个问题。例如,在包含课程列表的部门视图中,我将为每个课程汇总。我是否会在部门中存储一些轻量级课程对象的集合,其中那些轻量级课程对象存储聚合值?
我想在不同的场景中需要不同级别的抽象,我不确定处理这个问题的最佳方法。我应该有一个对象模型,其中有一个非常基本的课程对象来存储聚合,还有一个子对象可以存储完整的细节吗?
此外,如果有任何有用的资源可以帮助我理解如何模拟这些伟大的事物。
答案 0 :(得分:4)
不要过度复杂化,也不要做不必要的工作。数据库在数据操作方面是完美的,所以让DB进行聚合。在代码方面,在对象模型中再添加一个对象,你就会很好并且花花公子:
class CourseStats
string Name { get; }
int Enrollments { get; }
int Withdrawals { get; }
进行聚合的SQL非常简单。但是,请确保使用ORM(思考NHibernate)或不太复杂的结果集映射器(想想BLToolkit):您真的不想手动水合这些对象。
另一个好处是,您可以缓存两个查询结果(并在与课程相关的更改时立即使缓存无效)。
答案 1 :(得分:1)
这实际上是一个很大的问题,很多人都在苦苦挣扎。
据我所知,在这个问题上至少有两种思想流派:
Jeremy Miller有article in MSDN Magazine调查一些持久性模式。
本书Domain-Driven Design对聚合建模进行了很好的讨论。
答案 2 :(得分:0)
如果部门很少,每个部门都有少量课程,只需加载所有内容并让对象进行数学计算(即部门会对课程列表进行迭代,然后总结您需要的内容)。
另一种方法是使用一些自定义的本机SQL对数据库运行总和。您可以在DAL中隐藏它。然后,DAL将返回一个虚拟课程(数据库中不存在,但包含总和)。
第三种方法是将这些值保留在department对象中的某个位置,并在每次更改/添加/删除课程时更新它们。
答案 3 :(得分:0)
如果您正在使用.NET,您应该调查的一件事是LINQ to SQL。它将允许您在DAL中拥有非常优雅的界面。 LINQ将允许您在BLL中创建aggregate queries,从而节省管道代码以及遍布源代码的令人讨厌的SQL片段。使用LINQ表示的聚合SQL查询的上一个链接的示例:
var averageOrderTotals =
customers.
Select(c => new {
c.Name,
AverageOrderTotal = c.Orders.Average(o => o.Total)
});
我已将我的数据库层切换到LINQ,尽管在我的 case我不使用MS SQL Server,所以我使用了DbLinq库。
您要做的最后一件事是必须修改您的类以适应您的数据库访问层,这样做会使您的解决方案非常脆弱。