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 @ 2009-09-01 17:39 Birdshover 阅读(...) 评论(...) 编辑 收藏