我有一个带有服务器和客户端的 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
}
现在我想知道是否有什么方法不需要以这种方式实现每个控制器,因为除了一些实现特殊功能的特定控制器之外,它们大多是空的。
我在谷歌上搜索了动态控制器,但没有找到太多关于如何做到这一点的信息。
不需要为每个控制器创建一个几乎空的类,这对我来说是非常有益的,因为我有许多实体/类,并且每个实体/类都需要一个控制器。
根据我的经验,干净而有效的方法是每个组件使用不同的控制器,但是,如果有一个相同的方法,例如您的GetList,我会在继承的控制器中编写该特定方法,例如GenericController 并从所有控制器调用它。这样我就可以两全其美,一方面编写逻辑并在需要时调用,但另一方面能够在将来执行额外的逻辑。
如果您想拥有一个主控制器 - 然后将所有 API 调用从 blazor 指向该特定控制器,但是,请务必将 URL 作为参数传递,以了解它是从哪个组件调用的(不确定从堆栈跟踪中是否可见)。 - 这种方法的问题是,如果您需要特定端点的不同逻辑,例如 [Authroize] 属性,它只会变得混乱和复杂。