У меня есть веб-приложение ASP.NET Core 2.2 MVC, использующее шаблон репозитория. Я создал класс с именем LogAttribute
, который получен из ActionFilterAttribute , чтобы я мог регистрировать информацию после выполнения действий контроллера.
Вот пример использования этого атрибута фильтра действия в mvcкласс контроллера:
public class HomeController : Controller
{
private readonly IMyRepository _repository;
public HomeController(IMyRepository repository)
{
_repository = repository;
}
[Log("Go to Home Page")]
public async Task<IActionResult> Index()
{
...
}
[Log("Go to About Page")]
public async Task<IActionResult> About()
{
...
}
}
Поэтому, когда я перехожу на /Home
, он должен войти в «Перейти на домашнюю страницу». И когда я перехожу на страницу /About
, она должна вести журнал «Перейти к странице».
Однако я не знаю, как получить доступ к своему хранилищу из класса LogAttribute
. Вот класс LogAttribute
:
public class LogAttribute : ActionFilterAttribute
{
private IDictionary<string, object> _arguments;
private IMyRepository _repository;
public string Description { get; set; }
public LogAttribute(string description)
{
Description = description;
}
// // Injecting repository as a dependency in the ctor DOESN'T WORK
// public LogAttribute(string description, IMyRepository repository)
// {
// Description = description;
// _repository = repository;
// }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_arguments = filterContext.ActionArguments;
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var description = Description;
// NullReferenceException since I don't know
// how to access _repository from this class
_repository.AddLog(new LogAction
{
Description = description
});
}
}
Итак, мой вопрос, как я могу получить доступ к своему хранилищу (или, по крайней мере, к моему DbContext) из моего LogAttribute
класса?