Свободная конфигурация SourceBuilder вызывает исключение InvalidOperationException - PullRequest
3 голосов
/ 13 января 2012

Я создаю DLL для ведения журналов, которая упростит EntLib 5 Logging Application Block.Я использую 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.Нужно ли разрешать DLL с помощью Unity?

1 Ответ

3 голосов
/ 13 января 2012

Мне кажется, проблема в том, что вы на самом деле не создали Formatter. Вы ссылаетесь на существующий форматер по имени с помощью оператора .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");
...