MVVM解决方案结构:项目分区应该是垂直的(按功能)还是水平的(按层)?

MVVM解决方案结构:项目分区应该是垂直的(按功能)还是水平的(按层)?,mvvm,architecture,solution,Mvvm,Architecture,Solution,我在一套在医疗环境中执行数据采集的应用程序中工作。其想法是拥有一个通用的基础结构(包括硬件IO、文件IO、通用域模型)和一个薄的顶层,每个健康专业都有单独的项目 模型层是一个丰富的域模型,主要包含域数据类型。 在模型层之上是业务层,主要处理工作流。例如,有一个CaptureConductor类,它采用ICaptureDevice、一个IPlotterModel和一个IFileWriter类(每个类都来自域模型),并使它们一起工作。我还有AnalysisConductor,AnalysisRepo

我在一套在医疗环境中执行数据采集的应用程序中工作。其想法是拥有一个通用的基础结构(包括硬件IO、文件IO、通用域模型)和一个薄的顶层,每个健康专业都有单独的项目

模型层是一个丰富的域模型,主要包含域数据类型。 在模型层之上是业务层,主要处理工作流。例如,有一个
CaptureConductor
类,它采用
ICaptureDevice
、一个
IPlotterModel
和一个
IFileWriter
类(每个类都来自域模型),并使它们一起工作。我还有
AnalysisConductor
AnalysisReportModel
DeviceConfigurationConductor
,以及处理更高级别工作流的其他类

然后我有一些VIEW模型,其中每一个都倾向于从业务层映射到一个或几个对象(我认为仍然是MVVM的“模型”部分)。因此,“SomeFeatureViewModel”映射到“SomeFeatureModel”,而“OtherFeatureViewModel”映射到“OtherFeatureViewModel”,等等

由于我使用的是MVVM框架(本例中为MVVM Light),因此我决定将此依赖关系“集中”到一个项目中,因此我创建了一个ViewModel项目,其中包含许多不相关的ViewModels

所以我的问题是:这是一个好的分区吗

一方面,在执行此操作(水平分区)时,我将框架依赖性集中在ViewModel层及以上,因此模型层可以是“纯”的。但这给了我低内聚性(ViewModel项目包含许多不相关的内容)和高耦合性(每次我需要一个ViewModel时,我都需要引用一个大型项目)


另一方面,如果我垂直分区,也就是说,我让View和ViewModel在每个项目中共存,按功能分组,我会得到更好的结果(IMO)内聚和低耦合,缺点是几乎在每个项目中都引用框架。

如果可能的话,尝试将您的ViewModels划分为几个项目,并将相关的ViewModels放在一起。这将在一定程度上提高内聚性和降低整体耦合。

我认为您必须根据这些特性将功能分组在一起。我认为在大多数情况下
ViewModel
倾向于与
视图一起更改,因此它们应该放在单个包中

您的
ViewModel
项目让我感觉不到连接。它既不是您软件的UI层,也不是业务逻辑层。它是UI的一部分,不知为何与之分离

另外,我认为您的不同项目可能需要不同的
ViewModel
s连接到单个
模型,对吗

因此,我认为您的业务逻辑层应该是一个框架。
View
s+
ViewModel
s应该是每个健康专业的不同项目。如果需要,这些项目可以扩展您的框架


这是否符合您的需要?

谢谢您的回答!实际上,每个健康专业都会以不同的方式呈现相同的捕获数据(因此用户可以对数据执行专业特定的操作),但数据捕获的底层执行在不同的专业之间是完全相同的。这就是为什么我将ViewModel作为给定模型的包装(一对一关系),而每个特定的应用程序将具有不同的视图(一对多ViewModel/视图关系)。你认为这有意义吗?(改进之前的评论)例如,我目前将CaptureModel和CaptureViewModel重构为一个名为CaptureService的项目,以便每个处理数据捕获的应用程序都可以引用这个包含模型(业务逻辑)及其包装ViewModel的“服务”程序集(一种基于数据绑定的外观,可用于不同的可能视图)。