I have a Custom Logging Attribute as below:
public class LoggerAttribute: ActionFilterAttribute
{
private readonly IHttpLogService _httpLogService;
private readonly ILogService _logService;
public LoggerAttribute(IHttpLogService httpLogService, ILogService logService)
{
_httpLogService = httpLogService;
_logService = logService;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
LogDetails(filterContext);
}
private void LogDetails(ActionExecutingContext filterContext)
{
try
{
HttpLogService httpService = new HttpLogService();
var httplogger = new LogMetaData()
{
RequestParams = filterContext,
ResponseParams = filterContext
};
_httpLogService.Emit("source", "", "Name", httplogger);
}
catch (Exception ex)
{
_logService.Emit(Core.Enums.LogLevel.Error, "token", "Error encountered while trying to execute the request.", ex);
throw new Exception("An error occurred. Please try again later.");
}
}
}
Following is the code from controller action method from where I need to execute the above filter, but the below code doesn't work, because I am not sure how to pass the service through the attribute:
[LoggerAttribute]
public int testMethod(RequestObject obj)
{
-----
}
The IHttpLogService & ILogService are the one that I need to inject into my custom filter attribute. But I am not quite sure how I can do this. Can someone please help me out with this?
You will have to separate the attribute from the actionfilter. Keep the attribute plain and simple:
And let your actionfilter do the magic:
Don't forget to register your actionfilter at startup:
Even better: you can use an IAsyncActionFilter now!