我喜欢我的3个.NET应用程序分成单独的项目,以提高模块化和关注点分离,但我有我的电脑上的性能问题(没有足够的内存和处理能力),所以Visual Studio是缓慢和不顺眼时,与那里工作是在一个解决方案的许多项目,所以我虽然把所有的层在一个组件,但仍使用的代码和设计它如同每个类型是在其各自的层的。 我想知道一两件事,如果有的话,你已经尝试这样做,你有没有什么建议或不做或对此的任何想法?
我不是在寻找一个讨论,我只是想知道是否有做这种方式的任何严重的风险?
Answer 1:
其中一个是分层是在.NET和其他强类型的平台有益的理由是,你不能(容易)添加项目/库之间循环引用。 这确保了,至少在封装级,依赖关系将形成一个有向非循环图 (DAG)。 这是一件好事,因为它迫使我们减少耦合 。
在C#中,这是完全可以通过编译形成循环图码( ClassA
引用ClassB
,它引用ClassC
,这反过来又引用ClassA
)。 因此,把所有的代码放到一个单一的Visual Studio C#项目中删除一些编译时的保护是分层提供的。
但是,如果不是你写在F#整个项目,你会重新获得编译时的保护,因为如果它包含周期F#代码不能编译(尽管可以声明特定例外模块内的规则......看对部分相互递归的类型 )。
所以,如果C#编写整个应用程序,你最有可能会出现问题,但如果你在F#写,你应该是不错的。
Answer 2:
主要的风险是,你的层次感会削弱随着时间的推移,你修改代码。 这是因为你或你的团队没有意识到,当他们正在一个代码更改,他们打破了分层(相对明显,当你有独立的项目)。
如果只是你,你在你的心中显然有整个代码库这可能不是一个问题。 否则,你可以使用命名空间,使其更容易知道的任何一类被认为是属于哪一层。
当然,没有什么防止命名空间中蔓延之间的依赖关系不好的语言。可以肯定的这,你需要的语言之外的东西来定义和执行的层次感。 这通常意味着使用单独的工具来定义体系结构组件和依赖关系规则,它们映射到该代码,和当规则违反检测。 工作室终极具有分层图 ,这将做到这一点,像将其他工具Lattix (相关矩阵)和Structure101 ( 架构图 )。
Answer 3:
只要你保持纪律,妥善保管,分层你应该罚款。
Answer 4:
如何通过单元测试执行的架构? 您将需要整理出依赖的API,并表达从中编写测试边界的语言。
我看到,例如NDepend的有这可能可用于确定依赖性的API。 然后,你可以写测试,其中命名空间作为使用NDepend的API,也许反射边界。
如果有人这样做会很酷。
Answer 5:
根据我的经验非常大的项目进行一样糟糕的多个项目解决方案,当源文件的数量是相似的。 这主要似乎与磁盘性能(我想我的机器是5400转硬盘),并阻塞在读写大量的文件(磁盘I / O活动)。 事情的Visual Studio万吨并正在处理的磁盘(编译,调试,文件解析的智能感知,等等),这似乎是我的问题的根源 。
我会去尝试,在保持独立的项目文件,并为每个解决方案文件。