【译】Orchard架构设计模式
【http://stackoverflow.com/questions/10774185/orchard-plug-in-based-architecture-design-patterns】
【问】:
我目前正在研究软件架构、分层,并为此看了许多开源的.net项目,其中包括Orchard CMS。 我认为Orchard是一个很好的设计范例。
据我所知,良好的架构应该是UI,Service,Repositories和Entities应该被分离在不同的程序集中。但是在Orchard里面,我看见service,repository,entity相关的类和接口都在相同的文件夹和命名控件下。
请问这是一个反模式么?或者说这样设计架构对么?
【答】:
首先,程序集并不是分离架构的必要条件。
对于你的问题,回答是否定的。判断是否正确真正重要的是他们确实已经被分离了,而不是他们是否应该在不同的程序集中。而且,与大部分系统不一样,开发一个可扩展的CMS的所要考虑的因素是不同的。在一个可扩展的CMS系统中,正确的分离方式应该是解耦那些将来随时可能添加或者移除的features。然而在一个平常的分层系统中,则要求通过分层解耦来降低他们互相影响的风险。真正应该拿来比较的应该是分层系统和Orchard中的一个模块,而不是将他与整个Orchard进行比较。当然了,正如Orchard所实现的那样,好的实践都在模块里面使用了。
按程序集划分是基于分离考虑,这本身已经偏向于技术性的东西而不是架构了。你可以把程序集看成一个包含了代码的容器,这个容器是为了代码复用和动态链接。但不是实现分层的方法。这也是为什么他们使用模块来进行代码复用的原因。
另外我们从现实层面考虑:好的架构有一个主要的目的,就是使得程序可以更方面和廉价的进行维护(同时并不是像设计宇航系统那样设计出只有他们自己看得懂的架构)。其次一个目的是编写出可扩展和性能良好的应用程序(尽管这个目的更加难以实现,因为他很容易导致过早优化,这是许多软件的灾难源泉)。
对于第一个目的,概念分离是很重要的,但是具体通过什么方式进行分离却不是那么重要。
而第二个目的则恰好与使用程序集进行分层的理念相违背:在你添加额外的模块之前,Orchard已经有了许多的程序集。这些程序集从来都不是无限制使用的。在Orchard中,他们需要被动态的编译,加载,JIT翻译,并通过内存来运行等等。从性能方面来看,你通常应该降低程序集的数量来达到性能优化的目的。
对于现今的Orchard来说,如果你要将Orchard划分到不同的程序集中,然后将每个模块依次划分到这些程序集。那么你将需要分层数*模块数的程序集,成百个的程序集到时候会需要被加载,显然不好。事实上,我们甚至考虑过将所有的程序集动态的编译到一个程序集中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?