I've just updated one of my ASP.NET Core projects to version 1.1, and since that I'm getting the following error (works fine on first call but fails on the following)
Cannot access a disposed object.
on the following line:
private ILogger logger;
public ValuesController(ILoggerFactory loggingFactory)
{
logger = loggingFactory.CreateLogger<ValuesController>();
}
The project is using DryIoc as container and my startup looks like this:
using System;
using DryIoc;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using DryIoc.Microsoft.DependencyInjection;
namespace WebApplication2
{
public class CompositionRoot
{
public CompositionRoot(IRegistrator r){}
}
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc().AddControllersAsServices();
return new Container()
// setup DI adapter
.WithDependencyInjectionAdapter(services,
// optional: propagate exception if specified types are not resolved, and prevent fallback to default Asp resolution
throwIfUnresolved: type => type.Name.EndsWith("Controller"))
// add registrations from CompositionRoot classs
.ConfigureServiceProvider<CompositionRoot>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
}
}
}
my project.json look like this:
{
"dependencies": {
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.Extensions.Logging": "1.1.0",
"Microsoft.Extensions.Configuration.Json": "1.1.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0",
"Microsoft.AspNetCore.Routing": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.1.0",
"Microsoft.Extensions.Logging.Debug": "1.1.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
"DryIoc.Microsoft.DependencyInjection": "1.0.2"
},
"tools": {
},
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
}
}
},
"buildOptions": {
"emitEntryPoint": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
Any help would be greatly appreciated
The issue is fixed in v1.1.1.
The problem was due external instances registered as transient. The disposable instance is tracked by container, but will be disposed with the first scope (request) and therefore will throw exception in second scope (request). Now it is registered as singleton.
Btw. to find out problems or customize framework registrations in DryIoc container you may provide your registerDescriptor
delegate into WithDependencyInjectionAdapter
method. The sample in DryIoc repo is updated with example usage