通用控制器,无需实现它

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

我有一个带有服务器和客户端的 Blazor 应用程序,其中客户端具有通用服务,用于我的项目中所有不同类型的 CRUD 操作。然后,此通用服务调用服务器中执行逻辑的特定控制器。

客户端有一个通用服务,用于调用服务器上不同控制器的所有 CRUD 操作的所有不同类:

public async Task<IEnumerable<Type>> GetListAsync()
{
    string url = apiUrl + $"/api/{typeof(Type).Name}";
    string authToken = await GetAccessTokenAsync();

    logger.LogInformation("Retrieving list...");
    using HttpClient httpClient = GetHttpClient();
    return await HttpClientHelper.GetAsync<IEnumerable<Type>>(httpClient, url, authToken);
}

...

然后服务器有一个通用控制器,其中包含所有不同服务通用的所有方法:

public class GenericController<Type, Identity, Filter> : ControllerBase where Identity : IIdentity
{
    private readonly IGenericService<Type, Identity, Filter> _service;

    public GenericController(IGenericService<Type, Identity, Filter> service, ILogger logger)
    {
        _service = service;
        this.logger = logger;
    }

    [AllowAnonymous]
    [HttpGet]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status500InternalServerError)]
    public virtual async Task<ActionResult<IEnumerable<Type>>> GetList()
    {
        try
        {
            result = await _service.GetListAsync();
            return Ok(result);
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }

    }
}

然后,为了让 MVC 发现路由,我需要以这种方式为每种类型实现控制器:

[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ErrorCodeController : GenericController<ErrorCode, ErrorCodeIdentity, ErrorCodeFilter>
{
    #region Construction/destruction ...
    /// <summary>
    /// Constructor.
    /// </summary>
    public ErrorCodeController(IErrorCodeService service, ILogger<ErrorCodeController> logger) 
        : base(service, logger)
    {
    }
    #endregion
}

现在我想知道是否有什么方法不需要以这种方式实现每个控制器,因为除了一些实现特殊功能的特定控制器之外,它们大多是空的。

我在谷歌上搜索了动态控制器,但没有找到太多关于如何做到这一点的信息。

不需要为每个控制器创建一个几乎空的类,这对我来说是非常有益的,因为我有许多实体/类,并且每个实体/类都需要一个控制器。

c# controller blazor
1个回答
0
投票

根据我的经验,干净而有效的方法是每个组件使用不同的控制器,但是,如果有一个相同的方法,例如您的GetList,我会在继承的控制器中编写该特定方法,例如GenericController 并从所有控制器调用它。这样我就可以两全其美,一方面编写逻辑并在需要时调用,但另一方面能够在将来执行额外的逻辑。

如果您想拥有一个主控制器 - 然后将所有 API 调用从 blazor 指向该特定控制器,但是,请务必将 URL 作为参数传递,以了解它是从哪个组件调用的(不确定从堆栈跟踪中是否可见)。 - 这种方法的问题是,如果您需要特定端点的不同逻辑,例如 [Authroize] 属性,它只会变得混乱和复杂。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.