【发布时间】:2012-06-05 07:39:45
【问题描述】:
我们一直致力于为分层应用程序开发架构。我们计划有一个 ASP.NET MVC 表示层,它同时服务于移动浏览器和“普通”浏览器。也就是说,如果用户在移动设备上导航到网站,我们需要相同的 ASP.NET MVC 表示层来提供针对移动浏览器优化的视图,同时提供针对移动浏览器优化的“常规”视图如果用户使用的是台式机/笔记本电脑,则使用台式机/笔记本电脑浏览器。目前,我们不打算支持原生移动应用程序,但我们可能会在未来添加该功能。此外,该架构将具有域模型层——域实体、域服务等、应用程序服务和使用 EF 代码优先 POCO 以及存储库和工作单元模式的数据层——所有标准域模型类型设计。
但是,我一直试图找出域服务、应用程序服务和域实体中的行为(方法)之间的区别,因为它适用于我们正在开发的系统。下面是我们系统中的一个高级用例,以供检查。
我们有报告和报告组。这两个实体之间存在多对多的关系。数据库表是:Reports Jct_Reports_ReportGroups ReportGroups,域实体看起来像:
Report class :
public string ReportName { get; set; }
...
public virtual ICollection<ReportGroup> ReportGroups { get; set; }
ReportGroup class :
public string GroupName { get; set; }
...
public virtual ICollection<Report> Reports { get; set; }
当然,用户可以创建报告(无需创建报告组),并且他们可以创建包含一个或多个报告的报告组。此外,用户可以删除报告。当这种情况发生时,会发生很多事情。首先,我们检查报告是否在任何报告组中(单个报告可以在许多不同的报告组中)。如果在任何报告组中找到该报告,我们将遍历每个报告组并从报告组中删除该报告(通过从 Jct_Reports_ReportGroups 表中删除一行)。然后,对于包含要删除的报告的每个报告组,我们检查报告组中是否还有其他报告。如果报表组中没有其他报表,我们也会删除报表组(通过从 ReportGroups 表中删除行)。如果报告组中还有其他报告,我们不会删除该报告组。如果所有这些操作都成功,我们将删除用户选择的要删除的报告(通过删除 Reports 表中的行)。最后,向用户显示一条消息,说明报表删除是否成功。
我希望这是一个足够的用例来帮助理解我们整个应用程序的一小部分。
我在某处读到域服务封装了不适合域对象的业务逻辑,并且不是典型的 CRUD 操作,而外部消费者使用应用程序服务与您的系统对话 - 如果消费者需要访问对于 CRUD 操作,它们将在这里暴露。但是,我只是不了解 POCO 域实体中会使用哪些方法(业务逻辑),哪些业务逻辑将被视为域服务并包含在业务层中,以及哪些业务逻辑将被视为包含在应用服务层。所以,我的主要问题是:鉴于上述用例,关于如何区分域服务、应用程序服务和域实体中的行为(方法)的建议是什么?
【问题讨论】:
-
个人插件,不过看看我的文章:gorodinski.com/blog/2012/04/14/…
标签: asp.net-mvc architecture domain-driven-design service-layer