用于常见操作的最佳实践ASP.NET控制器



我有一个快速问题,

在很多例子中,我看到不返回任何View或Partialview的控制器操作也添加在同一个控制器中-现在在我的情况下,我有多个控制器,我需要运行相同的操作,如

  • 控制器A将运行操作A
  • 控制器B将运行动作A

在控制器A和B中添加操作A看起来不正确。

由于我使用AJAX对Action A进行[HttpPost]调用,因此,我希望它位于控制器中,以便于POST访问,尽管我不想在两个控制器中添加相同的Action

我可以在控制器A中添加动作A,并让控制器B访问来自控制器A的相同动作请求,但我认为

**如果我创建一个名为的新控制器怎么样

commonActionContoller

并在其中放入"ACTION A",当需要ACTION A时,让所有东西都使用commonActionContoller?**

干杯

EDIT:示例添加如下

一个有Person和Countrys的示例应用程序,因此Person模型对所有国家都是相同的,但我们对每个国家都有不同的Controller,因此如果管理员想将字段IsEmpoyed从true更新为false,则他们会转到例如{USA}/Index Controller并将true切换为false。现在,{AUS}/指数和{China}/指数也是如此,因此将IsEmpyed更改为true/false的操作在所有控制器中都是相同的。为了实现这一点,我不想将Action IsEmpired添加到所有国家/地区控制器中-(想不出更好的例子了)-

您应该在两个控制器中都编写ActionA。否则将违反单一责任原则。最佳实践是将实现代码从控制器移动到服务层。例如,如果你想为产品和子类别加载产品类别,那么代码如下:

public interface ICategoryService
{
List<Category> LoadCategory();
}
public class CategoryService : ICategoryService
{
public List<Category> LoadCategory()
{
//code here
}
}
public class ProductController : Controller
{
private readonly ICategoryService _categoryService;
public ProductController()
{
_categoryService = <inject dependency here>;
}
public ActionResult GetCategory()
{
var category = _categoryService.LoadCategory();
}
}
public class SubCategoryController : Controller
{
private readonly ICategoryService _categoryService;
public SubCategoryController()
{
_categoryService = <inject dependency here>;
}
public ActionResult GetCategory()
{
var category = _categoryService.LoadCategory();
}
}

这里的指导原则应该是关注点分离。

如果ControllerA和ControllerB具有特定的业务逻辑,并且添加CommonActions控制器可以为共享数据提供一个良好的隔离家庭,那么这是一个很好的做法。

如果没有更好地说明你的需求,尽管很难回答。

一个稍微好一点的例子可能是订单应用程序:

InventoryControllerEmployeeController

您可能不希望CommomController使用以下方法:

GetStoreClosingHours(int storeNumber);
GetTotalSales(int employeeId);
GetEmployeeComps(int employeeId);

IoC和依赖注入可能也会得到回报,具体取决于操作。任何控制器都可以调用以下方法:

GetLastLogonTime(thisEmployee);

毕竟,设计应用程序实际上是一套原则,最佳实践并不总是包装得非常整齐。我想说,最重要的是选择一些灵活、可扩展的东西,然后坚持下去

最新更新