Быстрая проблема конфигурации - PullRequest
2 голосов
/ 07 июля 2010

Я пытаюсь заставить работать свободную конфигурацию без успеха.Я получаю следующую ошибку:

Произошла ошибка активации при попытке получить экземпляр типа LogWriter, ключ ""

, когда я пытаюсь получить доступ к устройству записи:

Dim logwriter As LogWriter = EnterpriseLibraryContainer.Current.GetInstance(Of LogWriter)()

Конфигурация:

    Dim formatBuilder As New FormatterBuilder()
    Dim builder As New ConfigurationSourceBuilder()
    builder.ConfigureInstrumentation().EnableLogging()
    builder.ConfigureLogging.LogToCategoryNamed("Important") _
        .WithOptions.SetAsDefaultCategory() _
        .SendTo.RollingFile("StandardListener") _
                .RollEvery(RollInterval.Midnight) _
                .RollAfterSize(50000) _
                .WhenRollFileExists(RollFileExistsBehavior.Increment) _
        .FormatWith(formatBuilder.CustomFormatterNamed("StandardFormatter", GetType(StandardFormatter))) _
        .ToFile("D:\LogFiles\" + fileName)

Обновление

Я добавил

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

Я все еще не могу получитьlogwriter, и Logger в LAB тоже не может его получить (он использует EnterpriseLibraryContainer.Current.GetInstance<LogWriter>() внутренне);

Есть предложения?

Ответы [ 2 ]

1 голос
/ 30 августа 2010

Что вы на самом деле делаете с конфигурацией, когда закончите с ней? Вы положили его в источник конфигурации и передали его в контейнер или в Entlib?

На первый взгляд, ваша конфигурация выглядит нормально, но это только строит граф объектов. Затем вам нужно что-то вроде этого:

  dim configSource as new DictionaryConfigurationSource()
  builder.UpdateConfigurationSourceWithReplace(configSource)
  ' To use container directly
  dim container as IUnityContainer = new UnityContainer() _
    .AddExtension(New EnterpriseLibraryCoreExtension(configSource))

  ' Or, to use Entlib static APIs
  EnterpriseLibraryContainer.Current = EnterpriseLibrary.CreateDefaultContainer(configSource)

Это должно сделать это. Если это не так, пожалуйста, опубликуйте более подробный пример, и я, возможно, смогу отладить его для вас.

UPDATE

Следующий пример отлично работает для меня, я только что попробовал:

Imports Microsoft.Practices.EnterpriseLibrary.Logging
Imports Microsoft.Practices.EnterpriseLibrary.Common.Configuration
Imports Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners

Module Module1

    Sub Main()
        InitializeEntlib("test.log")

        Logger.Write("This is a test message")
    End Sub

    Sub InitializeEntlib(ByVal logFileName As String)
        Dim builder As New ConfigurationSourceBuilder
        builder.ConfigureLogging() _
        .LogToCategoryNamed("Important") _
        .WithOptions.SetAsDefaultCategory() _
        .SendTo _
            .RollingFile("StandardListener") _
                .RollEvery(RollInterval.Midnight) _
                .RollAfterSize(50000) _
                .WhenRollFileExists(RollFileExistsBehavior.Increment) _
            .FormatWith(New FormatterBuilder().TextFormatterNamed("Text Formatter")) _
            .ToFile("D:\LogFiles\" + logFileName)

        Dim configSource As New DictionaryConfigurationSource()
        builder.UpdateConfigurationWithReplace(configSource)

        EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource)
    End Sub
End Module

Единственное, что я могу видеть, это то, что я использую TextFormatter вместо того, чем является ваш StandardFormatter. Попробуйте это и посмотрите, работает ли это - если нет, то чего-то еще не хватает.

0 голосов
/ 08 июля 2010

Я только что получил похожую ошибку. Это было из-за неправильной конфигурации. Я использовал FormatWithSharedFormatter, но без определения общего форматера.

У меня нет жалоб во время:

var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);

или

EnterpriseLibraryContainer.Current
    = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

Все, что я получил, было то, что регистратор не был найден при попытке извлечь его из Unity. Удаление конфигурации FormatWithSharedFormatter заставило все работать.

...