0

我在 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 使用其他服务创建实例。

有人能帮我吗?

非常感谢。

麦克风。

4

0 回答 0