0

Fluent APIを使用して、構成ファイルなしでログを書き込もうとしています。

これは私のコードです:

 var builder = new ConfigurationSourceBuilder();
                builder.ConfigureData()
                .ForDatabaseNamed("Logging")
                .ThatIs.ASqlDatabase()
                .WithConnectionString(ConnectionString)
                .AsDefault();

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

 var logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();

 logger.Write("Test", "General");

私がこれを実行すると、それはただそれを言います

LogWriterタイプのインスタンス、キー""を取得しようとしたときにアクティベーションエラーが発生しました

構成で何を間違えましたか?

4

1 に答える 1

2

欠けているものが2つあります。

  1. EnterpriseLibraryContainer.CreateDefaultContainerメソッドを使用して構成でコンテナを更新するのを忘れました
  2. データアクセスを構成していますが、ロギングブロックを使用しようとしています

構成情報を使用してコンテナーを作成する方法は次のとおりです。

var builder = new ConfigurationSourceBuilder();
                builder.ConfigureData()
                .ForDatabaseNamed("Logging")
                .ThatIs.ASqlDatabase()
                .WithConnectionString(ConnectionString)
                .AsDefault();

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

 EnterpriseLibraryContainer.Current 
  = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

Fluent APIを使用してロギングを構成するには、FluentConfigurationAPIの使用を参照してください。

その記事の例は次のとおりです。

var builder = new ConfigurationSourceBuilder();

builder.ConfigureLogging()
       .WithOptions
         .DoNotRevertImpersonation()
       .LogToCategoryNamed("Security")
         .SendTo.FlatFile("Security Log File")
           .FormatWith(new FormatterBuilder()
             .TextFormatterNamed("Text Formatter")
               .UsingTemplate("Timestamp: {timestamp}...{newline})}"))
             .ToFile("security.log")
         .SendTo.EventLog("Formatted EventLog TraceListener")
            .FormatWithSharedFormatter("Text Formatter")
              .ToLog("Application")
       .LogToCategoryNamed("General")
         .WithOptions.SetAsDefaultCategory()
         .SendTo.SharedListenerNamed("Formatted EventLog TraceListener");

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

データアクセスブロックを使用してデータベースに書き込むように両方のロギングブロックを構成する場合は、流暢なインターフェイスを使用して行うこともできます。

var builder = new ConfigurationSourceBuilder();

builder.ConfigureData()
    .ForDatabaseNamed("Logging")
        .ThatIs.ASqlDatabase()
        .WithConnectionString(@"data source=.\SQLEXPRESS;Integrated Security=SSPI;Database=Logging")
    .AsDefault();

builder.ConfigureLogging()
        .WithOptions
            .DoNotRevertImpersonation()
        .LogToCategoryNamed("General")
            .WithOptions.SetAsDefaultCategory()
            .SendTo.Database("Database Trace Listener")
            .WithAddCategoryStoredProcedure("AddCategory")
            .UseDatabase("Logging")
            .Filter(System.Diagnostics.SourceLevels.All)
            .WithWriteLogStoredProcedure("WriteLog");


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

var logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
logger.Write(logEntry);
Logger.Write("Test", "General");
于 2013-01-08T13:55:21.157 に答える