ASP.NET Core core toctTocontontRegration中的AutoFac模块未调用
我使用autofac.extensions.ipendentencyindoction nuget软件包从ASP.NET迁移到ASP.NET核心。
对于我们的记录服务,我们使用一个模块将记录器的上下文设置为注射到:
internal class ContextualLoggingModule : Autofac.Module
{
/// <summary>
/// Dummy function which has an argument of <see cref="Core.Log.ILogger"/> type.
/// </summary>
/// <param name="logger">The logger.</param>
public static void DummyFunction(Core.Log.ILogger logger)
{
// dummy only method for Load method
}
/// <summary>
/// Loads and initializes the Logger
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
// Fake PropertyInfo that has ParameterType = typeof(ILogger), see .Preparing stuff below
var loggerPropertyInfo = typeof(ContextualLoggingModule).GetMethod(nameof(DummyFunction))?.GetParameters().Single();
builder.Register((componentContext, parameters) =>
{
Func<object> loggerFactory = null;
// ReSharper disable once UnusedVariable
var resolvedParameters = parameters.OfType<ResolvedParameter>()
.SingleOrDefault(resolvedParameter =>
{
return resolvedParameter.CanSupplyValue(loggerPropertyInfo, componentContext, out loggerFactory);
});
return loggerFactory();
})
.As<Core.Log.ILogger>();
}
static ResolvedParameter ILoggerCreatorParameter = new ResolvedParameter(
(p, i) => p.ParameterType == typeof(Core.Log.ILogger), // For constructor parameters of this type...
(p, i) => Logger.CreateFor(p.Member.DeclaringType) // ...return this instance
);
/// <summary>
/// This adds a handler for our ILogger. The Logger will get a SourceContext property which will contain the name of the type the logger is for. Example: class A.B wants an instance of ILogger than that logger will have a SourceContext property with a value of "A.B" which can later be used to see where a log entry came from.
/// </summary>
/// <param name="componentRegistry"></param>
/// <param name="registration"></param>
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += (sender, args) =>
{
if (args.Parameters.Any(p => p == ILoggerCreatorParameter))
{
return;
}
args.Parameters = new Parameter[]
{
ILoggerCreatorParameter
}.Concat(args.Parameters);
};
}
加载方法被调用的类型,但绝不是attacttocomponentRegrignation方法。我想念什么?它在迁移到asp.net core
startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(ConfigureMvcOptions);
services.AddSwaggerGen(c => c.EnableAnnotations());
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.Register(_ => Container).As<Core.DependencyInjection.IContainer>();
builder.Register(_ => Configuration).As<Core.Setting.IConfigurationProvider>();
var registrationManager = new RegistrationManager();
registrationManager.RegisterDependencies(builder); // Here the logging module is registered
}
program.cs之前起作用。
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
I'm migrating from ASP.Net to Asp.Net Core using Autofac.Extensions.DependencyInjection nuget package.
For our logging service we used a Module to set the context of the logger to the type it is injected to:
internal class ContextualLoggingModule : Autofac.Module
{
/// <summary>
/// Dummy function which has an argument of <see cref="Core.Log.ILogger"/> type.
/// </summary>
/// <param name="logger">The logger.</param>
public static void DummyFunction(Core.Log.ILogger logger)
{
// dummy only method for Load method
}
/// <summary>
/// Loads and initializes the Logger
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
// Fake PropertyInfo that has ParameterType = typeof(ILogger), see .Preparing stuff below
var loggerPropertyInfo = typeof(ContextualLoggingModule).GetMethod(nameof(DummyFunction))?.GetParameters().Single();
builder.Register((componentContext, parameters) =>
{
Func<object> loggerFactory = null;
// ReSharper disable once UnusedVariable
var resolvedParameters = parameters.OfType<ResolvedParameter>()
.SingleOrDefault(resolvedParameter =>
{
return resolvedParameter.CanSupplyValue(loggerPropertyInfo, componentContext, out loggerFactory);
});
return loggerFactory();
})
.As<Core.Log.ILogger>();
}
static ResolvedParameter ILoggerCreatorParameter = new ResolvedParameter(
(p, i) => p.ParameterType == typeof(Core.Log.ILogger), // For constructor parameters of this type...
(p, i) => Logger.CreateFor(p.Member.DeclaringType) // ...return this instance
);
/// <summary>
/// This adds a handler for our ILogger. The Logger will get a SourceContext property which will contain the name of the type the logger is for. Example: class A.B wants an instance of ILogger than that logger will have a SourceContext property with a value of "A.B" which can later be used to see where a log entry came from.
/// </summary>
/// <param name="componentRegistry"></param>
/// <param name="registration"></param>
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += (sender, args) =>
{
if (args.Parameters.Any(p => p == ILoggerCreatorParameter))
{
return;
}
args.Parameters = new Parameter[]
{
ILoggerCreatorParameter
}.Concat(args.Parameters);
};
}
The Load method is called, but never the AttachToComponentRegistration method. What am I missing? It worked before the migration to ASP.Net Core
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(ConfigureMvcOptions);
services.AddSwaggerGen(c => c.EnableAnnotations());
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.Register(_ => Container).As<Core.DependencyInjection.IContainer>();
builder.Register(_ => Configuration).As<Core.Setting.IConfigurationProvider>();
var registrationManager = new RegistrationManager();
registrationManager.RegisterDependencies(builder); // Here the logging module is registered
}
Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论