C# 在ASP.NET MVC中为控制器/操作使用WF

C# 在ASP.NET MVC中为控制器/操作使用WF,c#,asp.net-mvc,C#,Asp.net Mvc,已编辑-似乎我原来的问题没有足够清楚地解释我想要什么 我想做的是使用Windows工作流处理操作请求。我知道WF非常繁重,很难使用,但我还没有找到任何其他基于.NET的工作流库适合此任务 有没有人举过这样的例子?或者有人试过吗? 这是否是“真正的MVC”并不重要 编辑:我发布的“fat控制器”示例只是我想要添加WF的原因之一的一个示例-所有其他逻辑都封装在其他服务/业务层中,控制器唯一负责的事情就是调用这些服务并确定要显示的视图。对我来说,让这个UI特定的控制器代码可编辑是有意义的——特别是在

已编辑-似乎我原来的问题没有足够清楚地解释我想要什么

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

有没有人举过这样的例子?或者有人试过吗? 这是否是“真正的MVC”并不重要


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

为了澄清我最初的问题:我不是为了整理我的类而尝试将所有业务逻辑移动到工作流中,而是尝试将可重用控制器/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项目,希望使用我刚才创建的基于jQuery web的xoml编辑器来定义应用程序中可用的操作。 管理员UI的开发者部分已经能够生成/编辑数据模型和视图-我希望能够使用UI定义简单的控制器操作。 我将所有其他服务/业务逻辑放在扩展方法或服务类中

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


显然,一些复杂的控制器可能不适合,并且需要它们自己的自定义控制器类,但如果能够简单地修改工作流,以在网站B上引入一个新的“FilterByMailAddress”参数,则会很有用,虽然WebsiteA仍然保留原始过滤器。

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


我不认为将所有控制器逻辑移到WF中真的能解决您的问题-您只需要以一种不需要控制器只做表示逻辑的方式构造应用程序。

听起来您在控制器中承担了太多的责任。这是MVC、MVP和类似模式的新手的常见问题。趋势是将业务逻辑放入控制器,这只会导致混乱的体系结构

MVC中的控制器应该驱动和协调您的UI,而不是驱动业务逻辑。一般来说,控制器只能执行以下操作:

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


    在您的设计中实现最大的可组合性。把所有东西都塞进控制器会给你带来最少的可组合性和可重用性。将逻辑和责任分离为组件和层将极大地提高重用性,简化代码,并使WF等工具更易于使用。

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


    谢谢-我理解这一点,并同意这表明它缺乏适当的分层。我确实试着将我的大部分逻辑保留在适当的层中——有时我会走捷径,这是权重逐渐增加的地方(无论如何,我最终还是会进行重构)。我最近读了很多关于“脂肪控制器”的文章,这就是我在最初的问题中提到它的原因——我将更新我的问题,让你了解我希望实现的目标。