.net 一个组件内的分层体系结构

.net 一个组件内的分层体系结构,.net,design-patterns,architecture,.net,Design Patterns,Architecture,我更喜欢将我的3层.NET应用程序分为不同的项目,以增强模块化和关注点的分离,但我的计算机上存在性能问题(内存和处理能力不足),因此当一个解决方案中有许多项目时,visual studio速度较慢,不适合使用,因此,我想把所有的层放在一个程序集中,但仍然使用代码,并将其设计为每个类型都在其各自的层中。我想知道一件事,如果你们中有人尝试过这样做,关于这件事,你们有什么建议或不建议或想法吗? 我不想讨论,我只是想知道这样做是否有任何严重的风险?只要你保持适当分离层的原则,你就应该没事。根据我的经验,

我更喜欢将我的3层.NET应用程序分为不同的项目,以增强模块化和关注点的分离,但我的计算机上存在性能问题(内存和处理能力不足),因此当一个解决方案中有许多项目时,visual studio速度较慢,不适合使用,因此,我想把所有的层放在一个程序集中,但仍然使用代码,并将其设计为每个类型都在其各自的层中。我想知道一件事,如果你们中有人尝试过这样做,关于这件事,你们有什么建议或不建议或想法吗?

我不想讨论,我只是想知道这样做是否有任何严重的风险?

只要你保持适当分离层的原则,你就应该没事。

根据我的经验,当源文件数量相似时,执行的超大项目与多个项目解决方案一样糟糕。这似乎主要与磁盘性能(我想我的机器是5400 rpm磁盘)和大量文件的读写阻塞(磁盘I/O活动)有关。VisualStudio所做的大量工作都是处理磁盘(编译、调试、intellisense的文件解析等),这似乎是我问题的根源


我会尝试将这些文件保存在单独的项目中,并为每个项目创建一个解决方案文件

主要的风险是,随着时间的推移,您的分层会随着代码的更改而减少。这是因为您或您的团队在进行代码更改时没有意识到他们正在破坏分层(当您有单独的项目时,这种情况相对明显)

如果只是你,而且你的脑海中清楚地记住了整个代码库,那么这可能不是问题。否则,您可以使用名称空间来更容易地知道任何类都属于哪一层


当然,该语言中没有任何东西可以阻止名称空间之间的不良依赖性蔓延。为了确保这一点,您需要一些语言之外的东西来定义和实施分层。这通常意味着使用一个单独的工具来定义体系结构组件和依赖项规则,将它们映射到代码,并在违反规则时进行检测。Studio Ultimate有一个可以做到这一点的工具,其他工具如(dependency matrix)和()

如何通过单元测试来实施架构?您需要一个API来整理依赖关系,还需要一种语言来表示编写测试的边界

例如,我看到有一个API,可以用来确定依赖关系。然后,您可以使用NDepend API编写测试,其中名称空间充当边界,也可以使用反射


如果有人这样做,那就太酷了。

分层在.NET和其他强类型平台中有益的原因之一是您不能(轻松地)在项目/库之间添加循环引用。这确保至少在包级别,依赖项将形成一个有向无环图(DAG)。这是一件好事,因为它迫使我们减少耦合

C#中,完全可以编译形成循环图的代码(
ClassA
引用
ClassB
,引用
ClassC
,反过来又引用
ClassA
)。因此,将所有代码放在一个Visual Studio C#项目中可以消除分层提供的一些编译时保护

但是,如果您改为在F#中编写整个项目,您将重新获得编译时保护,因为如果F#代码包含循环,则不会编译(尽管可以在模块中声明该规则的特定异常…请参阅上一节)


因此,如果用C#编写整个应用程序,你很可能会遇到问题,但如果用F#编写,你应该会很好。

我认为这是一个非常好的问题,应该得到比“你会没事”更好的答案。没有一个开发人员像系统强制执行的规则那样纪律严明。Chris Chedgey的答案更好,但仍然依赖于手动检查。如果有人能为这个问题提供一个替代的、系统强制的解决方案,那将是非常有趣的。我最近在一个多装配项目中做过这件事。使用Assembly.getReferenceAssemblys()执行dll依赖性规则的代码非常简单。要在单个程序集中完成这项工作,您需要进行反射,但从头开始并不太复杂。