LoggingFactory 在第二次调用时处理
LoggingFactory disposed on second call
我刚刚将我的一个 ASP.NET 核心项目更新到 1.1 版,从那以后我收到以下错误(第一次调用时工作正常但接下来失败)
无法访问已释放的对象。
在以下行中:
private ILogger logger;
public ValuesController(ILoggerFactory loggingFactory)
{
logger = loggingFactory.CreateLogger<ValuesController>();
}
该项目使用 DryIoc 作为容器,我的启动如下所示:
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();
}
}
}
我的 project.json 看起来像这样:
{
"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%" ]
}
}
如有任何帮助,我们将不胜感激
将您的 CompositionRoot 替换为
public class CompositionRoot
{
public CompositionRoot(IRegistrator r)
{
r.Unregister<ILoggerFactory>();
r.Register<ILoggerFactory, LoggerFactory>(Reuse.Singleton);
}
}
P.s。已找到您的票 https://bitbucket.org/dadhi/dryioc/issues/432/loggingfactory-disposed-on-second-call。
问题已在 v1.1.1 中修复。
问题是由于外部实例注册为瞬态。一次性实例由容器跟踪,但将与第一个范围(请求)一起处理,因此将在第二个范围(请求)中抛出异常。现在注册为单例。
顺便说一句。要在 DryIoc 容器中找出问题或自定义框架注册,您可以将 registerDescriptor
委托提供给 WithDependencyInjectionAdapter
方法。 DryIoc 存储库中的示例更新为 example usage
我刚刚将我的一个 ASP.NET 核心项目更新到 1.1 版,从那以后我收到以下错误(第一次调用时工作正常但接下来失败)
无法访问已释放的对象。
在以下行中:
private ILogger logger;
public ValuesController(ILoggerFactory loggingFactory)
{
logger = loggingFactory.CreateLogger<ValuesController>();
}
该项目使用 DryIoc 作为容器,我的启动如下所示:
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();
}
}
}
我的 project.json 看起来像这样:
{
"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%" ]
}
}
如有任何帮助,我们将不胜感激
将您的 CompositionRoot 替换为
public class CompositionRoot
{
public CompositionRoot(IRegistrator r)
{
r.Unregister<ILoggerFactory>();
r.Register<ILoggerFactory, LoggerFactory>(Reuse.Singleton);
}
}
P.s。已找到您的票 https://bitbucket.org/dadhi/dryioc/issues/432/loggingfactory-disposed-on-second-call。
问题已在 v1.1.1 中修复。
问题是由于外部实例注册为瞬态。一次性实例由容器跟踪,但将与第一个范围(请求)一起处理,因此将在第二个范围(请求)中抛出异常。现在注册为单例。
顺便说一句。要在 DryIoc 容器中找出问题或自定义框架注册,您可以将 registerDescriptor
委托提供给 WithDependencyInjectionAdapter
方法。 DryIoc 存储库中的示例更新为 example usage