私たちのチームは、WCF サービスの例外処理とログ記録の実装を自動化するライブラリを作成しました。このライブラリを使用すると、開発者はカスタム属性でサービスを装飾し、いくつかの単純な構成ファイル エントリをセットアップするだけで、一般的な例外処理とログ メカニズムを利用できます。
ライブラリの使用方法の例を次に示します。
[ErrorHandlingBehavior (LogWriterOption.EmailLogWriter, LogWriterOption.SQLLogWriter)]
public class SampleService : ISampleService
{
public string GetData(int value)
{
throw new DivideByZeroException();
//return string.Format("You entered: {0}", value);
}
}
ErrorHandlingBehavior クラスは、パラメーターで LogWriterOption 列挙型を取得する Logger オブジェクトを使用して、どこにログを記録するかを決定します。
私たちの最初の意図は、開発者が独自のロギング メカニズムを指定して ErrorHandlingBehavior に提供できるようにすることでした。これにより、Logger クラスに対するソリューションの依存関係を取り除くことができます (代わりに、ILogger を実装する任意のクラスを取り込みます)。ただし、以下の方法で属性を指定するとエラーが発生します。
[ErrorHandlingBehavior (new Logger (new HashSet<LogWriterOptions>
{LogWriterOption.EmailLogWriter, LogWriterOption.SQLLogWriter}))]
属性を指定するときに何もインスタンス化できないように思われるため、ユーザーに独自のロギング メカニズムを指定させることができなくなりました。
誰かがこれを回避する方法を知っていますか? 依存関係を配線する代わりに、ILogger を実装するクラスのインスタンスを属性に与えるにはどうすればよいでしょうか?