有一个使用分层(洋葱)架构的应用程序框架。目前,VisualStudio 中的解决方案结构如下所示:
RootNs (Solution)
├ Domain (Solution Folder)
│ ├ RootNs.Domain.DataModel
│ ├ RootNs.Domain.Interfaces
│ └ RootNs.Domain.Core
├ Services (Solution Folder)
│ ├ RootNs.Services.DomainServices
│ └ RootNs.Services.ApplicationServices
├ Infrastructure (Solution Folder)
│ └ RootNs.Infrastructure
└ Presentation (Solution Folder)
└ RootNs.Presentation.Wpf
接口 ( RootNs.Domain.Interfaces) 处于最低/内部级别,理论上不应该依赖任何东西。
但是,在这种情况下,应该在哪里定义用于定义接口的枚举呢?现在我这样做:
// RootNs.Domain.Core
public enum FontFamily
{
Serif = 0,
SansSerif = 1,
Monospace = 2
}
[Flags]
public enum TextDecoration
{
None = 0,
Bold = 1,
Italic = 2,
Underline = 4
}
// RootNs.Domain.Interfaces
public interface ITextBox
{
TextDecoration TextDecoration { get; set; }
FontFamily FontFamily { get; set; }
// etc.
}
// RootNs.Domain.DataModel
public class TextBox : ITextBox
{
// interface implementation...
}
在上面的示例中,TextBox它是存储在商店中的实体的一部分。应用程序本身将包含 WPF 和控制台的表示层。目前(根据 AK 的建议)我已将接口和域模型中使用的枚举和结构添加到接口和模型中,RootNs.Domain.Core并且已经Core添加为依赖项。这是对的吗?
一般来说,从纯粹实用的角度来看,我通常会在 Domain 项目中制作一个 Models 和 Enums 文件夹。这对于普通用途来说已经足够了。
如果我们考虑基于洋葱和 DDD 的架构,那么通常建议在其中创建一个域项目(特定于您的应用程序的抽象)和一个核心项目(特定于主题领域的抽象)。在这种情况下,请亲自查看您的特定枚举是特定于应用程序的还是特定于域的。
我不会对项目进行太多拆分(我怀疑您是否会从每个项目中为外部承包商收集一个单独的 nuget),但如果您真的想要,那么最好将您的项目命名为 RootNs.Domain.Enums 或至少 RootNs .Domain.Core,共享这个词,对我来说,拉扯冗余的关联。
这是我真实项目中的一个示例(我之前描述了一些片段):
在这里,大多数枚举(例如角色字典 - 黑手党、警长、平民)都位于域中,无需将兴趣和枚举推到单独的项目上。
在这里你可以看到我在服务和存储库上构建的旧架构,在这里你可以看到所有接口都在域中,实现在 DAL / Persistence 中。从您的问题来看,您的接口实现连接域和数据库项目,在这种情况下,就我而言,枚举应该位于需要它们的位置(如果域中不需要它们,请将它们带到实现中,如果需要,采取他们到域)。
在 DDD 项目中,我也经常看到 Common 项目,他们在其中拆除了不适合清晰抽象的东西 :)