SCSF中的Module依赖方式问题

休息了一个月,终于要重出江湖了。新工作是做Winform开发,解决方案中SCSF是很关键的部分。以前没接触过SCSF框架,对MVP模式了解有限,本文也就不对SCSF作深入的分析,只从MVP架构依赖关系上进行一些简单的分析。今天第一次接触这个框架,写得有问题的地方,大家指正。

创建SCSF项目后就可以运行了,这个时候如果添加一个Module,那么运行时的样子完全变掉了。这跟添加的Module默认模板生成的Module类有很大关系。

复制代码
        private void ShowLayoutView()
        {
            
if (_rootWorkItem.Workspaces.Contains(WorkspaceNames.LayoutWorkspace))
            {
                LayoutView layout 
= _rootWorkItem.Items.AddNew<LayoutView>();
                _rootWorkItem.Workspaces[WorkspaceNames.LayoutWorkspace].Show(layout);
            }
            
else
                
throw new ModuleLoadException("LayoutWorkpsace not found");
        }
复制代码
ShowLayoutView方法把Workspaces的主窗体给覆盖掉了。这个窗体结构是在Infrastructure.Layout程序集定义的。Infrastructure.Layout相当于WebForm里的MasterPage,是一个布局。而如何很好地利用这个布局呢?

这个时候一般有两个处理方法。

一、修改Infrastructure.Layout

修改Infrastructure.Layout并不是修改布局,而是修改逻辑。我的理解,按SCSF框架的原意,应该是新建的Module依赖于Infrastructure.Layout,而这里的修改Infrastructure.Layout的以上是把依赖关系反过来,由Infrastructure.Layout定义事件驱动创建的新的Module。我认为,这种方式会造成严重的依赖问题,而且事件的管理过于集中。这种方式非常像是简单工作的工作方式。但是这种开发更加符合不分层的开发方式,就直观理解上来说,要比分层容易理解。但是应该会给维护造成很大的麻烦。

二、修改Module的加载

Module的加载与Shell里ProfileCatalog.xml定义的Modules顺序无关,关键是要看Show方法。有Show方法,这个View就会显示,否则将不会显示。应该在新建Module程序集的Module类控制哪些View被显示。而因为新建的Module1完全不知道Module2,因此,不可能由Module来驱动Module,因此,在同一个Layout下的View应该创建在一个Module中。显示的时候_rootWorkItem.Workspaces[WorkspaceNames.RightWorkspace].Show(layout);注意,在Layout里定义了3个区域,这3个区域可以分别加载。而在事件驱动时,可以通过Close方法关闭加载的View,避免内存浪费。

另外,在Services中定义业务逻辑部分,似乎在View中也能够被使用,这就违背了MVP的本意。数据应该在Presenter类被组织,而后被View引用。否则就是MVC而不是MVP了。

对有多个Form以及View接口如何使用,暂时还没有深入思考,有经验的朋友请指点一二。

posted @   Birdshover  阅读(3030)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2008-09-01 Lucene.Net 2.3.1开发介绍 —— 三、索引(一)
点击右上角即可分享
微信分享提示