gpt4 book ai didi

c# - 如何在不同的 Controller 中实现调用另一个 Action 的 Controller Action ?

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:17 24 4
gpt4 key购买 nike

我正在使用 ASP.NET 核心创建 Web API,并且对如何处理发布到审计/日志表感到困惑。

有两个表,一个事件表,一个事件日志表。如果用户创建了一个新事件,那么它将向事件和事件日志表中添加一个条目。如果用户编辑事件的名称/描述,它也会在事件日志表中创建一个新条目。请注意,事件日志表在结构上与事件表基本相同。

事件表

+------------------+
| Event Table |
+------------------+
| Id |
| EventName |
| EventDescription |
| CreatorId |
+------------------+

事件日志表

+------------------+
| Event Log Table |
+------------------+
| Id |
| EventId |
| EventName |
| EventDescription |
| EditorId |
| TimeEdited |
+------------------+

目前,我的 Web API 中有两个单独的 Controller 用于两个表中的每一个,即一个事件 Controller 和一个事件日志 Controller

目前发生了什么:当有一个事件的post/put时,它会创建一个事件日志 Controller 的实例,并调用创建事件日志的post方法,传入新的创建/更新事件日志对象。

下面是一些简化的代码...

在 EventController.cs..

public IActionResult PostEvent([FromBody] Event event)
{
_context.Event.Add(event);
_context.Event.SaveChanges();

EventLogController logController = new EventLogController(context);
logController.PostEventLog(event);

return Ok();
}

在 EventLogController.cs 中...

public IActionResult PostEventLog([FromBody] Event event)
{
var eventLog = _mapper.Map<EventLog>(event);
eventLog.TimeEdited = DateTime.Now;

_context.EventLog.Add(eventLog);
_context.EventLog.SaveChanges();

return Ok();
}

虽然这工作正常,但就目前而言,我很担心这是否是最佳实践(创建一个新的 Controller 只是为了调用一个方法似乎很糟糕)。可能需要注意的是,我不想向每个 Controller 发送两个单独的 API 调用。我希望由于添加/更新条目而创建事件日志。

在我看来,我可以采取一些其他方法...

  1. 创建存储库/服务?用于将 EventLog 添加到数据库并将其注入(inject) EventController。虽然这确实让我可以避免创建 Controller ,但我听说创建存储库是 asp.net core 中不必要的抽象。

  2. 在 EventController 的 PostEvent 操作中添加事件日志条目,而无需创建 Controller 或存储库/服务。但是,这意味着操作方法正在处理两个请求。

  3. 继续当前的方法,但只注入(inject) EventLog Controller 而不是创建新实例。

至于我认为我做不到的事情...

我不认为我可以在数据库本身内创建触发器,因为创建事件条目不包含足够的信息来创建事件日志(因为数据库不知道编辑器)。

我也不认为我可以使用 RedirectToAction,因为它是一个 post 请求,需要在正文中发送一些内容。

所以我的问题是:在相关实体的每次创建/更新时创建日志/审计条目的正确方法是什么?

最佳答案

我更愿意创建一个单独的类,您在“其他方法 1”中实际提到的内容。然后您可以从多个地方调用它。

如您所知,一般来说,有很多种方法都是可行的。经验法则应该始终是:“ Controller 应该只控制,它不应该自己做工作。”这意味着 Controller 应该只知道调用什么来完成工作。如果遵循这一原则,您可以将实际代码放在一个单独的类中,然后您可以根据需要从一个或多个 Controller 的多个位置调用它。

关于c# - 如何在不同的 Controller 中实现调用另一个 Action 的 Controller Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com