领域模型应该在哪一层?

In which layer should the domain model go?

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

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

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

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

问题是:如果为了改变持久性逻辑,我们必须改变那些替代品的实际项目引用(例如 Entity Framework 对于 NHibernate),应该在哪里定义这个接口?更重要的是,域类应该定义在哪里?是否 "valid" 添加另一个名为 "Domain" 的层,为持久层和服务层所知?

如果我写的东西看起来很奇怪,我很抱歉,我写的英文有点生疏。

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

至于域,您可以为每个域创建一组项目,例如 Domains.NameHere.Facade、Domains.NameHere.Implementation、Domains.NameHere.UnitTests。通过这种方式,您还可以分离 façade 项目中的接口。您可以在 Domains.Implementation 项目中添加您的服务层,并在此处包含您的所有其他域 classes。

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