在ASPNET MVC 正式版发布前Jeremy DMiller 和Chad Myers 就在ASPNET MVC的早期版本上进行了一些工作并对底层实现做了一些修改后来他们改掉了几乎所有的ASPNET MVC实现于是决定构造另一个MVC实现FubuMVC 不久后Mark Nijhof 被邀请加入项目并成为主要成员
Fubu代表For usby us现在FubuMVC除了使用ASPNET Routing外不使用任何ASPNET MVC的实现代码而ASPNET Routing则已经包含在NET Framework SP中
Jon Arild Tørresda询问了Chad MyersASPNET MVC与FubuMVC之间最大的不同是什么
如果非要选一个我选择组合对继承这是一个设计上的基本区别但并不是说ASPNET MVC的设计不好只是我认为ASPNET MVC在类结构设计上倾向于使用继承因而无法像使用组合那样易于设计动态的Web应用程序
FubuMVC是一个前端控制器 (Front Controller)框架Chad指出这个模式的两个主要目标是
·分离对请求的不同关注点
·允许使用组合的方式构造响应以发回给客户端
对于前端控制器Chad解释道我们不是不能使用ASPNET MVC来实现前端控制器但是这非常的困难
在FubuMVC中有很多实现方面的决定其中之一是在Controller的Action执行前后所执行的行为Chad解释了为什么他们管它叫行为以及它在FubuMVC中的意义
当我在一个Virual ALTNET(VAN)会议上向一些人演示FubuMVC的早期版本时Steven Harman (http://stevenharmannet)建议我将之称为行为因为这个词语准确描述了所发生的事我有点喜欢这个名字
在FubuMVC中行为的实现方式实际上是装饰模式和职责链模式的混合体
行为对请求管道拥有完全控制权它可以添加或修改请求动态选择需要执行的action以及是否要执行action它可以修改或者完全替换action的输出结果并且可以在完成请求处理后执行一些代码实际上生成显示结果本身也是一个行为FubuMVC使用行为本身来实现基本的功能这些基本功能和行为可以根据需要被替换或修改
Mark Nijhof在他的文章FubuMVC and the Front Controller style framework中展示了这个管道
Chad说行为开启了在其他框架中难以实现的可能
·将整个请求包装在try/catch/finally块中的能力
·多级缓存的能力
·根据运行时环境或请求时间动态决定执行哪个action的能力
MVC模式的另一个方面是使得开发人员可以对传统意义上无法进行测试的UI部分进行单元测试Chad描述了微软是如何实现这一点的
微软在最近对MVC框架的更新中(BetaRC和最终的发布版)迈出了一大步相比于Preview 对单元测试的支持更好了但是我仍然认为继承和防备代码的过度使用以及故意不使用接口使得在ASPNET MVC中进行测试显得很笨重
他继续解释了FubuMVC是如何实现这一模式的
相反FubuMVC使用简洁的易于mock的接口着重于高内聚低耦合的设计其中低耦合更成功一些但这一切仍在开发之中我希望将来的设计可以提高内聚程度
FubuMVC高度依赖SOLID原则这使得它有很高的灵活性开发人员仅仅使用一个mock就可以替换框架中的整套部件并且可以使用任何他们喜欢的mock框架
FubuMVC并没有很多的防御性代码……相反它将注意力集中在设计提供自由控制的组件上面这些组建是客户代码主要存在的地方控制器(controller)行为视图(view)以及可以重载的部分
FubuMVC的类之间几乎没有依赖关系仅有的依赖也是对接口的依赖这些接口可以很容易的用mock对象来模拟
由于项目中有Jeremy(IoC容器StructureMap的创建者)你可能会认为控制反转和IoC容器会得到较多的支持事实上也确实如此
目前的版本仅支持StructureMap但是将来很可能会加入对其他容器的支持框架对于容器的使用非常少仅限于在配置时使用其余的部分利用容器的自动绑定功能完成因此基本上没有使用service location对于仅有的一点service location我们使用微软Patterns and Practices的Common Service Locator进行处理它可以让我们方便的替换底层依附于CSL模式的IoC容器(多数容器都满足这个条件)
FubuMVC还有一个contrib project相比于FubuMVC的核心框架这个项目的目标有什么不同:
我们希望能够有更多的自由来发展FubuMVC因此建立了FubuMVC Contrib我们想尝试一下插件这样可以有更多的人参与进来他们可以在较少的限制下做更多的尝试同时保持核心框架的稳定
FubuMVC核心框架将会维持少数几个成员对待补丁会更谨慎对框架的修改也会更少FubuMVCContrib将会有更多的参与者更多的改动更低的要求可能有无法工作的代码或实验性质的代码当在contrib中开发出有趣的东西后可以将这些东西合并到核心框架或者拆分到单独的项目中
现今FubuMVC还没有ASPNET MVC那样成熟但是它的实现方式很有趣这个框架将会如何发展它与ASPNET MVC的发展方向将会有怎样的不同我们将拭目以待关于FubuMVC的更多信息可以查看他们的wiki和Ryan Kelley的从头开始学FubuMVC教程