Asp.Core Depenency Injection Session Null

201 views Asked by At

I have a Asp.Core project with dependency injection. The problem is that when I get an instance of a CustomerService my session is null. But I pass it through with dependency injection.

My Controller looks like this:

private ISessionService _sessionService;
private IContainer _container;

public AuthController(ISessionService sessionService, IContainer container) {
    _container = container;
    _sessionService = sessionService;

    // here my session is NOT NULL
    string userName = _sessionService.Username;
}

public IActionResult Index() {
    // here I have some code so the line below is not always needeed and   therefore not injected in the constructor
    IUserService userService = _container.GetInstance<IUserService>();

    // here my session is NULL
    string name = userService.GetUserName();
}

public class UserService : IUserService {

    private ISessionService _sessionService;
    private IHttpContextAccessor _httpContextAccessor;

    public UserService(ISessionService sessionSerivce, IHttpContextAccessor httpContextAccessor) {
        _sessionService = sessionSerivce;
        _httpContextAccessor = httpContextAccessor;
    }

    public string GetUserName() {
        return _sessionService.User.Name;
    }
}

my StartUp.cs where I'm using StructureMap

Container container = new Container(expr => {
    expr.For<IHttpContextAccessor>().Use<HttpContextAccessor>();
    expr.For<ISessionService>().Use<SessionService>();
    expr.For<IUserService>().Use<UserService>();
});

So why is my session null when I instantiate a UserService object when using the container class ?

UPDATE

I know now that the Session object is null because the life cycle of a MVC page. In my BaseController class I created a method named InitContainer like this:

public void InitContainer(Type typeOfInterface, Type typeOfClass) {
    Configure(expr =>
        For(typeOfInterface).Use(typeOfClass)                
            .Ctor<ISessionService>().Is(_sessionService)
            .Ctor<IHttpContextAccessor>().Is(_httpContextAccessor)
        );
    }
}

When I want to use an instance of a service than I do this in my Controller method:

public IActionResult Test() {
        InitContainer(typeof(ICustomerService), typeof(CustomerService));
        ICustomerService customerService = _container.GetInstance<ICustomerService>();
}

I don't know if it's ugly or the right way to do this, but it works for me now. Has someone a better way to do this?

0

There are 0 answers