.NET Core DbContext Dependency Resolution Scope

.net-core c# dbcontext dependency-injection entity-framework-core

Question

I am experiencing an issue where DbContext instance injected into a controller is different than the instance injected into a service.

Below is my DbContext registration:

services.AddDbContext<CRMContext>();
services.AddScoped<IEstimateRepository, EstimateRepository>();
services.AddScoped<IMaterialRecordRepository, MaterialRecordRepository>();

My understanding is that by default, AddDbContext adds the context as Scoped, so I would expect that the controller and service would share the same instance.

For reference, here is the controller constructor and the service:

public LineItemController(IEstimateRepository repository)
{
        _estimateRepository = repository;
}

public VentChuteLineItemRequiredEventHandler(IEstimateRepository estimateRepository, IMaterialRecordRepository materialRepository)
        {
            _materialRepository = materialRepository;
            _estimateRepository = estimateRepository;
        }

I am also using Autofac in this application, however as far as I can tell it is not in any way related to the problem at hand. It seems to be just a fundamental misunderstanding on my part of how the scoped lifetime of the DbContext is handled.

1
0
7/17/2018 4:17:43 AM

Accepted Answer

The issue ended up being related to a static class that I was using to create an instance of the service in question.

public static class DomainEventHandler
{
    public static ILifetimeScope _container { get; set; }

    public static void Raise<T>(T args) where T : IDomainEvent
    {
        foreach (var handler in _container.Resolve<IEnumerable<IHandle<T>>>())
        {
            handler.Handle(args);
        }
    }
}

Since the DomainEventHandler class is static, I assume the .net core dependency resolver knew that the lifetime of any instances it contains to not match the request, and therefore created a new DbContext instance for it to use.

Refactoring this class to no longer be static resolves the issue.

0
7/17/2018 3:30:26 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow