Beetlejuice
Beetlejuice

Reputation: 4425

Access IHttpContextAccessor inside an extension class

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

Answers (2)

Arsalan Valoojerdi
Arsalan Valoojerdi

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

Roman
Roman

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

Related Questions