Search code examples
asp.net-coredryioc

DryIoc ASP.Net Core 3.1 DbContext store in Scope Container


I am using DryIoc (last release version) for Dependency Injection. In my application (Asp.net Core 3.1), I am using Entity Framework. My AppDbContext hinerits DbContext and implements IDisposable I also use UnitOfWork pattern and the class is disposable.

These two objects are declared as Transient. I follow the documentation of DryIoc that explains the context with Transient Disposable objects: https://github.com/dadhi/DryIoc/blob/master/docs/DryIoc.Docs/ReuseAndScopes.md

For my AppDbContext, I resolve this service manually. Same thing for my UnitOfWork. At the end I call Dispose method. But these two instances are not destroyed and are stored in the Singleton Scope of the DryIoc Container.

I did some tests and use JetBrain dotMemory. My test is to call 100 times a method

  • Call controler
  • open UnitOfWork
  • create AppDbContext
  • call database to get my data
  • close / dispose objects.

At the end, I have 100 times my AppDbContext and my UnitOfWork in the scope of the container:

enter image description here

I tried a lot of combinations of creation of container but each time, it is the same thing:

var container = new Container(rules =>
                rules.With(propertiesAndFields: request => request.ServiceType.Name.EndsWith("Controller") ? PropertiesAndFields.Auto(request) : null)
            //    .WithoutThrowOnRegisteringDisposableTransient()
            //    .WithTrackingDisposableTransients()
                .WithoutThrowIfDependencyHasShorterReuseLifespan())
            .WithDependencyInjectionAdapter(services);

Result: memory is growing up fast because of these two kind of objects stored in the scope.

If I comment .WithoutThrowOnRegisteringDisposableTransient(), my code is still working (I thought an exception would be thrown)

I tried also to declare these services as Scoped (for each http request) but it does not work because I don't create scope for each query. (Exception thrown and a scope is automatically opened per each web request by Asp .Net Core framework).

Maybe I need to dispose scope at the end of each request?

How could I force destruction of objects?


Solution

  • Thanks to the author of the lib, I found solution: https://github.com/dadhi/DryIoc/issues/261