Reputation: 4425
Is it possible to access IHttpContextAccessor instance inside an extension class?
I have a DateTime extension class and for some functions I need to access IHttpContextAccessor to get user Claims.
For example:
public static DateTime ToClientDateTime(this DateTime value)
{
var offset = ////get user timezone from claims here ///
return value.AddHours(offset ?? 0);
}
Maybe I using an incorrect approach and maybe I have to change all my extension class to a DateTimeService that could be injected when needed.
Upvotes: 0
Views: 1462
Reputation: 1026
First option is pass it to your method as a parameter like this.
public class ClientsController
{
public IHttpContextAccessor _httpContextAccessor;
public ClientsController(IHttpContextAccessor httpContextAccessor)
{ // Inject Here
_httpContextAccessor = httpContextAccessor;
}
public void DoSomething()
{
var dateTime = DateTime.Now.ToClientDateTime(httpContextAccessor);
}
}
public static class DateTimeExtensions
{
public static DateTime ToClientDateTime(this DateTime value,IHttpContextAccessor accessor)
{
var offset = ////get user timezone from claims here ///
return value.AddHours(offset ?? 0);
}
}
Another option is to use Service Locator but this is an antipattern and hide dependencies from client and makes your code untestable.
public static class DateTimeExtensions
{
public static DateTime ToClientDateTime(this DateTime dateTime)
{
var accessor = ServiceLocator.Resolve<IHttpContextAccessor>();
var offset = ////get user timezone from claims here ///
return value.AddHours(offset ?? 0);
}
}
Upvotes: 1
Reputation: 12171
The only way to access IHttpContextAccessor
in extension methods is to pass it to a method as a parameter.
You can't use dependency injection with static classes.
public static DateTime ToClientDateTime(this DateTime value, IHttpContextAccessor httpContextAccessor)
{
var offset = // use httpContextAccessor
return value.AddHours(offset ?? 0);
}
Upvotes: 0