领域模型应该放在哪一层?

Posted

技术标签:

【中文标题】领域模型应该放在哪一层?【英文标题】:In which layer should the domain model go? 【发布时间】:2016-04-29 20:14:57 【问题描述】:

我们必须为大学项目编写数字标牌应用程序。我们最初使用的语言和框架是:.Net、C#、实体框架(计划使用 NHibernate)、Winforms(计划使用 WPF)。

我们被告知这样做的方式可以让我们轻松更改表示和持久性逻辑。

因此,我们决定使用三层:“了解”服务层(或业务逻辑层)的 UI 层、了解持久层的服务层和持久层。他们每个人都是一个单独的项目。 目前,域类或实体类(在本例中为 Campaign、RSSFeed、User 等类)包含在持久性项目或层下的“模型”命名空间中。

我们为数据访问逻辑定义了一些接口,以便能够轻松切换存储介质。

问题是:如果为了更改持久性逻辑,我们必须更改实际项目引用以替换那些替换(例如 NHibernate 的实体框架),那么应该在哪里定义这个接口?更重要的是,应该在哪里定义域类?添加另一个名为“域”的层是否“有效”,持久层和服务层都知道?

如果我写的东西很奇怪,我很抱歉,我的书面英语有些生疏。

【问题讨论】:

【参考方案1】:

您可以做的是将持久性逻辑的接口提取到一个单独的项目中。然后只需将实现(EF 或 NHibernate)注入到使用它的类中。这样使用它的类只需要引用包含该接口的项目,而不需要具体的实现。

对于域,您可以为每个域创建一组项目,例如 Domains.NameHere.Facade、Domains.NameHere.Implementation、Domains.NameHere.UnitTests。这样,您还可以分离立面项目中的接口。您可以在 Domains.Implementation 项目中添加您的服务层,并在此处包含您的所有其他域类。

对于您的模型,您可以添加一个单独的项目,例如 Domains.Models 或将它们添加到您的外观项目中。对于您的持久性部分,您可以拥有自己的模型项目。这样您就可以更改模型中的某些内容,而无需更改持久性部分。

【讨论】:

以上是关于领域模型应该放在哪一层?的主要内容,如果未能解决你的问题,请参考以下文章

[框架]PureMVC简介

OSI 模型中的 HTTP 在哪一层?

Domain-Driven Design 领域驱动设计

DDD(领域驱动设计)

领域模型贫血模型充血模型概念总结

分析 - 哪一层?