【问题标题】:Fluent ConfigurationSourceBuilder Causes InvalidOperationExceptionFluent ConfigurationSourceBuilder 导致 InvalidOperationException
【发布时间】:2012-02-09 19:23:01
【问题描述】:

我正在构建一个日志 DLL,它将简化 EntLib 5 日志应用程序块。我正在使用ConfigurationSourceBuilder 为我的应用程序配置日志记录。我目前有这个:

var configBuilder = new ConfigurationSourceBuilder();

        configBuilder.ConfigureLogging().WithOptions
            .DoNotRevertImpersonation()
            .LogToCategoryNamed("EventLog")
                .WithOptions.SetAsDefaultCategory()
                .SendTo.EventLog("Event Log Listener")
                .FormatWithSharedFormatter("Text Formatter")
                .ToLog("Application")
            .LogToCategoryNamed("Email")
                .SendTo.Email("Email Trace Listener")
                .To(ToEmail)
                .From(fromEmail)
                .WithSubjectStart("Error:")
                .UsingSmtpServer(SmtpServer)
                .UsingSmtpServerPort(SmtpServerPort)
                .Unauthenticated()
                .FormatWithSharedFormatter("Text Formatter")
            .LogToCategoryNamed("LogFile")
                .SendTo.FlatFile("Flat File Trace Listener")
                .ToFile(logFileName)
                .WithHeader("------------------------------")
                .WithFooter("------------------------------")
                .FormatWithSharedFormatter("Text Formatter");

        var configSource = new DictionaryConfigurationSource();
        configBuilder.UpdateConfigurationWithReplace(configSource);
        EnterpriseLibraryContainer.Current = 
            EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

程序将构建,我将在主应用程序中引用它。当它开始设置配置时,会出现以下错误:

InvalidOperationException - The current type,
Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.ILogFormatter, 
is an interface and cannot be constructed. Are you missing a type mapping?

以防万一,主应用程序使用 Unity 作为 IoC。我需要用 Unity 解析 DLL 吗?

【问题讨论】:

    标签: c# asp.net logging unity-container enterprise-library


    【解决方案1】:

    在我看来,问题在于您实际上还没有创建格式化程序。您已使用语句 .FormatWithSharedFormatter("Text Formatter") 按名称引用现有格式化程序。

    如果您使用FormatterBuilder 定义格式化程序,那么应该没问题:

    var configBuilder = new ConfigurationSourceBuilder();
    
    configBuilder.ConfigureLogging().WithOptions
    .DoNotRevertImpersonation()
    .LogToCategoryNamed("EventLog")
        .WithOptions.SetAsDefaultCategory()
        .SendTo.EventLog("Event Log Listener")
        .FormatWith(
            new FormatterBuilder()
                .TextFormatterNamed("Text Formatter")
                .UsingTemplate("Timestamp: {timestamp}{newline}Message: {message}{newline}Category: {category}")
            )
        .ToLog("Application")
    .LogToCategoryNamed("Email")
        .SendTo.Email("Email Trace Listener")
        .To(ToEmail)
        .From(fromEmail)
        .WithSubjectStart("Error:")
        .UsingSmtpServer(SmtpServer)
        .UsingSmtpServerPort(SmtpServerPort)
        .Unauthenticated()
        .FormatWithSharedFormatter("Text Formatter")
    .LogToCategoryNamed("LogFile")
        .SendTo.FlatFile("Flat File Trace Listener")
        .ToFile(logFileName)
        .WithHeader("------------------------------")
        .WithFooter("------------------------------")
        .FormatWithSharedFormatter("Text Formatter");
    

    【讨论】:

    • 哇,这么简单!非常感谢图佐
    猜你喜欢
    • 2022-01-11
    • 2017-09-20
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多