我在ASP.Net MVC应用程序中使用Autofac模块时遇到问题。
我使用NLogModule来"注册" Nlog:
public class NLogModule : Module
{
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += onComponentPreparing;
}
private static void onComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter(
(p,i) => p.ParameterType == typeof(Portail.Utils.Logging.ILogger),
(p, i) => new NLogLogger(LogManager.GetLogger(t.FullName)))
});
}
}
我还在构建器中添加了模块:
builder.RegisterModule<NLogModule>();
对于需要我的记录器的构建器中注册的不同服务,一切正常。
现在,我想在文件中记录每个SQL查询。我按照以下文章https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx
最后在我的LoggerCommandInterceptor类中,我需要解析ILogger。但它没有用。
Autofac.Core.Registration.ComponentNotRegisteredException: 'The requested service 'Portail.Utils.Logging.ILogger' has not been registered.
我不明白为什么它不起作用。与服务的唯一区别是我自己创建了LoggerCommandInterceptor的实例
public PortailDbConfiguration()
{
SetDatabaseLogFormatter((context, writeAction) => new OneLineFormatter(context, writeAction));
this.AddInterceptor(new LoggerCommandInterceptor());
}
public class LoggerCommandInterceptor : IDbCommandInterceptor
{
#region Fields
private static ILogger _logger;
#endregion
#region Constructors
public LoggerCommandInterceptor()
{
var scope = EngineContext.Current.ContainerManager.Scope();
_logger = EngineContext.Current.ContainerManager.Resolve<ILogger>();
}
#endregion
...
和其他服务一样,Autofac创建实例。
有人可以帮助我吗?
非常感谢。
麦克