Я создаю веб-API с использованием ядра ASP.NET и не понимаю, как подойти к публикации в таблице аудита / журнала.
Существуют две таблицы, таблица событий и таблица журнала событий.Если пользователь создает новое событие, он добавляет запись в таблицу событий и в журнал событий.Если пользователь редактирует имя / описание события, он также создает новую запись в таблице журнала событий.Обратите внимание, что таблица журнала событий в основном идентична по структуре таблице событий.
Таблица событий
+------------------+
| Event Table |
+------------------+
| Id |
| EventName |
| EventDescription |
| CreatorId |
+------------------+
Таблица журнала событий
+------------------+
| Event Log Table |
+------------------+
| Id |
| EventId |
| EventName |
| EventDescription |
| EditorId |
| TimeEdited |
+------------------+
В настоящее время в моем веб-API есть два отдельных контроллера для каждой из двух таблиц, например Контроллер событий и контроллер журнала событий .
Что в данный момент происходит: Когда есть событие для записи / размещения события, оно создает экземпляр контроллера журнала событий и вызывает метод 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();
}
Пока это работает нормально, на данный момент, Я весьма обеспокоен тем, является ли это лучшей практикой (Этокажется плохим создание нового контроллера только для вызова одного метода).Может быть полезно отметить, что я не хочу отправлять два отдельных вызова API каждому контроллеру.Я хотел бы, чтобы журнал событий создавался как следствие добавления / обновления записи.
На мой взгляд, я мог бы использовать некоторые другие подходы ...
Создать репозиторий / сервис?для добавления EventLog в базу данных и внедрения его в EventController.Хотя это позволяет мне избежать создания контроллера, я слышал, что создание репозитория является ненужной абстракцией в ядре asp.net.
Добавьте запись журнала событий в действие PostEvent в EventControllerбез создания контроллера или хранилища / службы.Однако это означает, что метод действия позаботится о двух запросах.
Продолжайте использовать текущий подход, но просто добавьте контроллер EventLog вместо создания нового экземпляра.
Что касается вещей, которые я не думаю, что могу сделать ...
Я не думаю, что смогу создать триггер в самой базе данных с момента созданиязапись о событии не содержит достаточно информации для создания журнала событий (поскольку база данных не знает о редакторе).
Я также не думаю, что могу использовать RedirectToAction, поскольку это почтовый запрос, требующий чего-тодля отправки в теле.
Итак, мой вопрос: каков будет правильный способ создания записи журнала / аудита при каждом создании / обновлении связанного объекта?