c# - Autofac 日志记录模块和 ASP.Net Web 表单中的解析参数

标签 c# asp.net webforms autofac nlog

我正在尝试使用 Autofac 模块将 NLog 记录器注入(inject)到 asp.net Web Forms 应用程序(代码隐藏),但在尝试使用 ResolvedParameter 时出现错误:

全局 asax 和日志记录模块:

public class Global : HttpApplication, IContainerProviderAccessor
{

    static IContainerProvider _containerProvider;
    public IContainerProvider ContainerProvider
    {
        get { return _containerProvider; }
    }

    void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule<LoggingModule>();
        _containerProvider = new ContainerProvider(builder.Build());

    }
}

 public class LoggingModule : Module
 {
     protected override void Load(ContainerBuilder builder)
     {
         builder.Register(RegsiterFunc).AsImplementedInterfaces();
     }

     private NLogger RegsiterFunc(IComponentContext arg, IEnumerable<Parameter> parameters)
     {
         return new NLogger(parameters.TypedAs<Type>());
     }

    protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
    {
        registration.Preparing +=
            (sender, args) =>
            {
                var forType = args.Component.Activator.LimitType;

                var logParameter = new ResolvedParameter(
                    (p, c) => p.ParameterType == typeof(ILogger),
                    (p, c) => c.Resolve<ILogger>(TypedParameter.From(forType)));

                 args.Parameters = args.Parameters.Union(new[] { logParameter });
            };
    }


}

NLogger 类:

public class NLogger : ILogger
    {
        private readonly Logger m_Logger;

        public NLogger(Type type)
        {
            m_Logger = LogManager.GetLogger(type.FullName);
        }

        public NLogger(string typeName)
        {
            m_Logger = LogManager.GetLogger(typeName);
        }

    .......
}

背后的aspx页面代码:

public partial class _Default : Page
{
    public ILogger m_Logger { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        m_Logger.Error("test");
    }
}

为了根据请求类型启动日志,我使用了 ResolvedParameter。

RegsiterFunc 中的 parameters.TypedAs() 行抛出异常:“序列不包含元素”。

相同的代码可以在 asp.net MVC 应用程序中运行,但在 Web 表单项目中失败。

System.InvalidOperationException occurred HResult=0x80131509 Message=Sequence contains no elements Source=Autofac StackTrace: at Autofac.ParameterExtensions.ConstantValue[TParameter,TValue](IEnumerable`1 parameters, Func`2 predicate) at Autofac.ParameterExtensions.TypedAs[T](IEnumerable`1 parameters) at WebApplication1.LoggingModule.RegsiterFunc(IComponentContext arg, IEnumerable`1 parameters) in Global.asax.cs:line 55 at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass0_0`1.b__0(IComponentContext c, IEnumerable`1 p) at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)

最佳答案

据我了解,在 RegsiterFunc 中,您正在尝试检索记录器注入(inject)的组件类型。

但是携带组件类型的参数不是TypedParameter,而是一个NamedParameter。这就是为什么你会得到异常(exception)。

尽管不太优雅,但 RegsiterFunc 的工作版本:

private NLogger RegsiterFunc(IComponentContext arg, IEnumerable<Parameter> parameters)
{
    var type = (Type)((NamedParameter)parameters.First()).Value;
    return new NLogger(type);
}

然后对于 Default.aspx 页面,传递给 NLogger 的类型将为 ASP.default_aspx

您创建的第二个参数:

new ResolvedParameter(
    (p, c) => p.ParameterType == typeof(ILogger),
    (p, c) => c.Resolve<ILogger>(TypedParameter.From(forType)));

未使用,因此无需重写 AttachToComponentRegistration

关于c# - Autofac 日志记录模块和 ASP.Net Web 表单中的解析参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129804/

相关文章:

c# - 从 WebControl 中获取 QueryString

c# - 是否可以在同一个 ASP.NET 应用程序中同时进行常规登录和 ActiveDirectory 登录?

c# - 检查json数组是否存在c#

c# - 从十进制转换为十进制? returns 有时返回 null 而不是 0

c# - 将任务作为要在异步方法 C# 中的循环内调用的参数传递

asp.net - 如何以编程方式删除 ascx 的 OutputCache?

asp.net - 在.NET Core中更新身份登录页面的默认前端设计

c# - DataTable 上的表达式树

ASP.NET 3.5 : Display UpdateProgress during Page_Load()

c# - 控制级别 ValidateRequestMode 没有效果