从控制器中提取常用功能

问题描述 投票:0回答:1

我无法决定提取项目中多个控制器的多种方法使用的某些功能的最佳方法

常用功能

var myId = httpContext?.User.Claims.FirstOrDefault(x => x.Type == "myId")?.Value;
//few operations and a couple of repository calls
//return the details

现在我想知道我应该将其移至基本控制器吗?我应该创建一个静态帮助器类吗?处理这个问题的最佳方法是什么?

编辑1: 我尝试解决这个问题:

public static class MyHelper
{   
    public static MyEntity? MyMethod(HttpContext httpContext, IMyRepo1 myRepo1,
        IMyRepo2 myRepo2)
    {
        var id = httpContext?.User.Claims.FirstOrDefault(c => c.Type == "myId")?.Value;
        var a = _myRepo1.CallRepo1Method(); 
    //random local operations on var a 
    var result = _myRepo2.CallRepo2Method();
    return result;
    }
}

//Call from controller
var result = MyHelper.MyMethod(HttpContext, _myRepo1, _myRepo2);
controller asp.net-core-webapi .net-6.0 httpcontext
1个回答
0
投票

以我的拙见,我们应该设计应用程序来避免高耦合,这意味着查询方法应该基于表,而不是基于业务的查询需求。我觉得最理想的场景是,一张表有一个查询语句,每当一个业务关联到这张表时,就用这个查询,我也知道从某些方面来说这是不可能的,因为我们的业务越来越复杂。

让我们回到你的场景,据我所知,我们当然可以定义一个控制器来拥有httpContext,然后进行大量查询,然后将该控制器注入到其他一些控制器或服务中,但我认为这不是将这么多逻辑合并到控制器中是一个很好的主意,我们应该将逻辑放入服务中,在控制器中,我们最多调用多个服务。

因此,如果我是你,我将拥有一项收到

myId
的服务,并执行一个数据库查询。如果有多个数据库查询,那么所有这些都在这个服务中进行,如果已经存在多个数据库查询服务,那么我可能会在控制器中一一调用这些服务。

public class CountryController : Controller
{
    private readonly IMyHelper _myHelper;
    public CountryController(IMyHelper myHelper) { 
        _myHelper = myHelper;
    }
    public IActionResult Index()
    {
        var model = new CountryViewModel();
        var date = _myHelper.operateRepo("myid");
        return View(model);
    }
}

public class MyHelper : IMyHelper
{
    private readonly ILogger<MyHelper> _logger;
    private readonly IRepoOne _repoOne;
    private readonly IRepoTwo _repoTwo;

    public MyHelper(ILogger<MyHelper> logger, IRepoOne repoOne, IRepoTwo repoTwo) {
        _logger = logger;
        _repoOne = repoOne;
        _repoTwo = repoTwo;
    }
    public string operateRepo(string id)
    {
        var res = _repoOne.xxmethod();
        //some operation on res here
        var res2 = _repoTwo.yymethod();
        //some opeartation here
        return "done";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.