领域模型应该放在哪一层?
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 或将它们添加到您的外观项目中。对于您的持久性部分,您可以拥有自己的模型项目。这样您就可以更改模型中的某些内容,而无需更改持久性部分。
【讨论】:
以上是关于领域模型应该放在哪一层?的主要内容,如果未能解决你的问题,请参考以下文章