Xamarin 架构项目或命名空间

Xamarin Architecture Projects or Namespaces

我正在使用 Xamarin 为 iOS、Android 和 Windows phone 开发应用程序,我对架构有疑问。来自他们的网站:

从他们提供的示例解决方案中:

link to git source

他们将业务层、数据访问层和数据层放在同一个项目中。

但在此之后,当他们解释架构时:

封装:[...] 这意味着 UI 代码(例如)应该只负责显示屏幕和接受用户输入;并且从不直接与数据库交互。 [...]

和:

[...]将代码分层使应用程序更易于理解、测试和维护。建议每一层中的代码在物理上是分开的(在目录中或者对于非常大的应用程序甚至是单独的项目)以及逻辑上分开的(使用命名空间)。[...] (强调我的)

如果他们在不同的项目上不是更好吗?我的意思是,如果都在同一个项目中,我在UI层引用了这个项目,那么我可以直接访问业务层和数据层,我不知道这样是否正确。

问题是:

可以接受(并接受),用目录分隔图层?

用目录和名称空间或项目分隔层更好(或最能接受)?

这个问题没有正确答案。关注点分离通常被认为是一个好的设计objective;但是,您对它的了解程度 and/or 具体实施方式因项目而异。对于 Xamarin 提供的许多示例项目,它们都不够大,无法为 Data/Domain/etc 分解成单独的项目。

正如 Jason 正确指出的那样,与大多数设计决策一样,这取决于情况。

需要考虑的几点:

按项目拆分

  • 清晰的关注点分离
  • 更好的代码重用
  • 允许强命名
  • 更清晰的依赖管理(与命名空间相比,意外引用项目的可能性更小)
  • 许可 - 如果您希望所有开发人员都在模型/视图模型上工作,但只有几个 Xamarin(或其他)许可
  • 多个团队 - 如果项目足够大,您可能在每一层都有团队工作。
  • 对于大型项目,拆分将允许您将每个层用于内部回购(例如 nuget)以供其他团队使用
  • 允许对每一层进行独立构建/测试

按文件夹拆分

  • 对于较小的应用程序/POC/原型来说更简单
  • 性能 - some discussion here
  • 项目更少,速度更快IDE,因此开发速度更快
  • 更少的项目,更快的构建

Would not it be better if they were on separate projects? I mean, if all it's in the same project, and I reference this project in the UI Layer, then I can acces The Business Layer, and the Data Layer directly, I do not know if this is correct.

....

It's acceptable (and accepted), to separate the layers with directories?

It's better (or most accepted) to separate the layers with directories and namespaces, or with projects?

关于你的第一个问题:没关系。假设您将每一层拆分为一个不同的项目(这意味着您为每一层都获得了一个程序集)。正如您所指出的,您仍然可以从更高层访问那些较低层中的代码。应用程序分层的原则只是说一层中的代码不能引用更高层中的代码 - 它 而不是 阻止您访问堆栈中的代码 "deeper"。唯一阻止这种情况的边界是 "tier" 边界 - 这更正式(并且跨越起来更昂贵)。

关于第二个问题:当然,如果你愿意,你可以这样做。但这不是强制性的。您当然可以拥有分层架构,而无需将每一层拆分为 subfolder/namespace。有时它甚至可能会妨碍您。对于某些设计哲学(例如某些形式的 DDD),最好使用命名空间来对垂直特征进行分组,而每个层的各种 classes 都位于相同的特征命名空间中(通常使用 class 识别层的命名约定)。

关于第三个问题:除非你有充分的理由,否则我不会将图层分成项目。 "Good reasons" 将包括:在应用程序之间共享代码、黑盒式单元测试,或者在开发团队拥有整个系统的一部分并且代码需要合并到更大的主线的大型系统中防止开发团队冲突具有正式验收检查点的非常受控的过程。

我当然不会为了分层而将代码拆分成更多的项目。每个额外的项目都会增加构建过程的开销。在某些时候,IDE 将开始阻塞它(尽管通常直到您在解决方案中获得超过 30 个左右的项目)。

实际上,绝大多数移动应用程序都不够大或不够复杂,不足以证明对这个主题的深思熟虑。如果您的项目足够大,以至于您正在考虑沿层边界将其拆分,那么可能是时候退后一步并重新考虑范围了。