2017-09-06 10 views
2

私は既にその質問hereを頼みましたが、私はStackoverflowの方が速いかもしれないと感じています。これは私が私のJSONの設定ファイルでそれをやろうとしている方法です:appsettings.jsonで自分のKeyGeneratorインスタンスを設定する方法は?

{ 
    "Serilog": { 
    "Using": [ "Serilog.Sinks.AzureTableStorage" ], 
    "WriteTo": [ 
     { 
     "Name": "AzureTableStorage", 
     "Args": { 
      "storageTableName": "Logs", 
      "connectionString": "*************", 
      "keyGenerator": "MyApp.Serilog.AzureTableStorage.MyKeyGenerator" 
     } 
     } 
    ], 
    "MinimumLevel": "Verbose" 
    } 
} 

これは私の発電機の実装です:

明らか
public class MyKeyGenerator : IKeyGenerator 
{ 
    public string GeneratePartitionKey(LogEvent logEvent) 
    { 
     return Environment.MachineName; 
    } 

    public string GenerateRowKey(LogEvent logEvent, string suffix = null) 
    { 
     return SUID.nextId().ToString(); 
    } 
} 

それが収まるようにしようとするので、.ReadFrom.Configuration操作は、InvalidCastExceptionをスローします文字列の内容をIKeyGeneratorパラメータに変換します。

MyKeyGeneratorクラスのインスタンスが作成され、そのパラメータに指定されるように、keyGeneratorパラメータを設定する必要がありますか?

答えて

3

私はserilog-settings-configurationをクローンし、コードに掘り下げた後、実際のパラメータがインタフェースである場合にJSON設定値がどのように期待されるのかを見つけました(StringArgumentValue.cs、57行目から74行目を参照)。

パラメーターとして渡すタイプを参照する正しい方法は、フルクラスとアセンブリ名をカンマで区切ってとすることです。そのクラスには、公開のデフォルトのコンストラクタも必要です。

例:

{ 
    "Serilog": { 
    "Using": [ "Serilog.Sinks.AzureTableStorage" ], 
    "WriteTo": [ 
     { 
     "Name": "AzureTableStorage", 
     "Args": { 
      "storageTableName": "Logs", 
      "connectionString": "*************", 
      "keyGenerator": "MyApp.Serilog.AzureTableStorage.MyKeyGenerator, MyApp" 
     } 
     } 
    ], 
    "MinimumLevel": "Verbose" 
    } 
} 

その方法は、コンフィギュレータは、適切にクラスをインスタンス化することができます!

+0

IMHOその 'throwOnError:false'引数を持たず、適切なエラーメッセージ(タイプが見つかりません)で例外をバブルアップさせるほうがはるかに役立ちます。私はここでエラーに投げていないユースケースが提供されているのか分かりません。 – formixian

関連する問題