在ASP.NET MVC中使用WF for Controller / Actions

时间:2009-11-24 05:22:52

标签: c# asp.net-mvc

已编辑 - 似乎我原来的问题没有解释我想要的内容

我想要做的是使用Windows Workflow来处理操作请求。我知道WF非常繁重且难以使用,但我还没有找到任何其他适合此任务的基于.NET的工作流程库。

有没有人有关于如何做到这一点的任何例子?或者有人试过吗? 这是否是“真正的MVC”并不重要。


编辑:我发布的“胖控制器”示例只是我想添加WF的原因之一 - 所有其他逻辑都封装在其他服务/业务层中,而控制器负责的唯一事情就是正在调用这些服务并确定要显示的视图。对我来说,使这个特定于UI的控制器代码可编辑是有意义的 - 特别是在我正在研究的CMS框架中。这就是为什么我想使用Workflow(我创建了一个基于jQuery的XOML编辑器)

只是为了澄清我原来的问题:我并没有试图将我的所有业务逻辑转移到工作流程中以试图整理我的类,我试图将可重用的Controller / UI逻辑从将类编译成可分发的XOML文件。

例如,我编写的许多控制器/操作都是:

public ActionResult List(string categoryId) {
  if (String.IsNullOrEmpty(categoryId))
  {
    var data = productRepository.GetCategories();
    return View("ListCategories",categories);
  }
  var data = productRepository.GetProductsByCategory(categoryId);
  return View("List",data);
}
public ActionResult Display(string productId) {
  var product = productRepository.GetProductsById(productId);
  return View("Display",product );
}

这些操作非常薄,可以提取到工作流程活动中,然后可以通过拖放界面进行定义。

我目前正在开发一个自定义CMS项目,并希望使用我之前创建的基于Web的基于xoml的joml编辑器来定义应用程序中可用的操作。 管理UI的开发人员部分已经能够生成/编辑数据模型和视图 - 我希望能够使用UI定义简单的控制器操作。 我已将所有其他服务/业务逻辑放在扩展方法或服务类中。

我打算将这些模块导出为基于XML的模块,因此可以轻松地将它们从一个网站移植到另一个网站。我将创建的大多数网站非常相似,因此不需要很多自定义代码。

显然,一些复杂的控制器可能不合适并且需要自己的自定义控制器类,但是能够简单地修改工作流以在WebsiteB上引入新的“filterByEmailAddress”参数,而在WebsiteA上是有用的。仍保留原始过滤器。

3 个答案:

答案 0 :(得分:2)

这可能不是您正在寻找的答案,但如果您的控制器变得超重,这可能表明您的应用程序缺乏适当的分层,因此您的控制器做得太多了。我建议您使用精心设计的体系结构(具有单独的表示,服务和数据访问层)来查看MVC教程。我推荐的是Rob Conery的MVC店面系列。

http://blog.wekeroad.com/mvc-storefront/mvc-storefront-part-1/

我认为将所有控制器逻辑转移到WF中并不能解决您的问题 - 您只需要以不需要控制器完成表示逻辑的方式构建应用程序。

答案 1 :(得分:0)

听起来你在控制器中包含了太多的责任。对于MVC,MVP和类似模式相对较新的人来说,这是一个常见问题。趋势是将业务逻辑放入控制器中,这只会导致混乱的架构。

MVC中的控制器应该驱动和协调您的UI,而不是驱动业务逻辑。一般来说,控制器不应超过以下内容:

  1. 处理用户操作
  2. 重定向到视图,操作或返回内容
  3. 调用 业务逻辑和/或工作流程
  4. 控制器中的实际功能逻辑应该很少(如果有的话)。控制器是用户与之交互的视图之间的中介,以及这些视图是门户的“域”。您的业​​务逻辑可以使用WF建模,应该完全独立于控制器。有时您可能具有“应用程序逻辑”,特定于特定UI的功能,并且这些逻辑应该与业务逻辑正确分离,或者包含在控制器中,或者可能在控制器和业务层之间的缓冲层中分解,如果它足够复杂的话。

    旨在实现设计中的最大可组合性。将所有内容填充到控制器中将使您的可组合性和可重用性最低。将逻辑分离并将职责分离为组件和层将极大地提高您的重用率,简化代码,并使利用WF等工具变得更加容易。

答案 2 :(得分:0)

在搜索引擎/博客上搜索没有成功后,我决定尝试自己创建一个示例。事实证明这比我想象的要容易得多 - 还有很多工作要做,但我认为结果可以用于概念验证。

You can find the solution and blog post here