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

时间:2017-10-13 04:38:06

标签: c# asp.net-mvc

我有一个简单的问题,

在很多例子中,我看到控制器动作没有返回任何视图或部分视图也被添加到同一个控制器中 - 现在在我的情况下,我有多个控制器,我需要运行相同的操作,如

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

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

因为我正在使用AJAX调用Action A [HttpPost],因此,我希望将它放在Controller中以便于POST访问,尽管我不想在两个控制器中添加相同的Action

我可以在控制器A中添加操作A,让控制器B访问从控制器A请求的相同操作,但是我在想什么

**如果我创建一个名为

的新控制器怎么样?
  

commonActionContoller

并将"行动A"在它中,当需要Action A时,让一切都使用commonActionContoller?**

干杯

编辑:示例添加如下

具有Person和Countries的示例应用程序,So Person模型对于所有国家/地区都是相同的,但我们对每个国家/地区都有不同的Controller,因此如果管理员想要将字段IsEmpoyed的Person模型从true更新为false,则他们去了例如{USA} / Index controller并将true切换为false。现在,对于{AUS} / Index和{China} / Index,这是相同的,因此将IsEmpyed更改为true / false的Action在所有控制器中都是相同的。为了完成这项工作,我不想将Action IsEmplyed添加到所有国家/地区的控制器 - (无法想出更好的例子) -

2 个答案:

答案 0 :(得分:1)

您应该在两个Controller中编写操作A。否则会违反Single responsibility principle。最佳实践是将实现代码从Controller移动到服务层。例如,如果要加载产品和子类别的产品类别,则代码将如下所示:

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();
    }
}

答案 1 :(得分:0)

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

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

虽然很难回答,但没有更好地说明您的需求。

稍微好一点的例子可能是订单申请:

InventoryController EmployeeController

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

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

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

GetLastLogonTime(thisEmployee);

毕竟,设计应用程序确实是一套原则,最佳实践并不总是整齐地打包。我说最重要的是选择灵活,可扩展的东西然后坚持下去。