私はさまざまなサイトに散らばっているこれらの質問のいくつかにぶつかりました.log4netが「ある」軽量ラッパーの価値に向けてl4nの役人によって答えが紡がれているようです(わかりませんか?)および同様の心構え-驚くべき事実。
しかし、ユーザーが求めているのは (これが私の質問です)、流暢な構成インターフェースで log4net オブジェクト モデルを registertype/registerinstance シーケンスに適合させる方法です。
ここでの目標は、l4n を再ラップすることではなく、流暢なフローをハイジャックする必要のない適切な参照を取得することです。
悪い例: LogManger.GetLogger メソッドから ILog の構成済みインスタンスへの参照を取得し、それを下流のオブジェクトのプロパティに挿入するのに十分早い段階で流暢なフローに入れたいと考えています。
そこで、せっかちな提案に応えて、正規の方法で ILog の通常のインスタンスを作成してみました。
log4net.Config.XmlConfigurator.Configure();
static readonly log4Net.Ilog Log = LogManager.GetLogger(thatlongassemblyreflectionstuff);
そのため、Unity コンテナーへの参照を追加して、私の素晴らしい人生を続けることは、(本当の意味で楽なという意味で) 取るに足らないことのように思えます。
ただし、RegisterInstance メソッドの署名では、インターフェイスではなく「型」が必要です。
log4net オブジェクト モデルを検索していない人は、次のように述べています。l4n は「ラッパー」であり、Log の実際の「タイプ」を取得することはできません。
だから今、私はテストする必要があります。そして、それが何を意味するかを知っています.1分かかるかもしれませんが、1時間か4時間かかる可能性が高いです.
ただし、正規のセットアップに関する省略された部分を除いた以下は機能しました。
container
.RegisterInstance("Logger", Log, new ContainerControlledLifetimeManager())
.RegisterType<IControllerContext, ControllerContext>
(
"CtlrCtx",
new ContainerControlledLifetimeManager(),
new InjectionConstructor(new ResolvedParameter<IMessageBuilder>("MsgBldr")),
new InjectionProperty("Log",new ResolvedParameter<ILog>("Logger"))
);
したがって、元の Log オブジェクトのハッシュコードと、私の小さな Context オブジェクトのプロパティに挿入された Log オブジェクトのハッシュコードは同じです。
でも...
インジェクション プロセスでは、Context オブジェクトの Log プロパティをそのインターフェイスを介して公開する必要がありました。つまり、これはもはや静的オブジェクトではありません。そして、log4net ILog オブジェクトが静的であるかどうかは、それがシリアライズ可能であり、「ランタイムが不安定になる」という劇的な警告 (マトリックス ファンだけにとって本当に意味がある) なしでアセンブリ間でマッシュできるかどうかに関する決定要因のようです)。
思いとどまるわけではありませんが、Resharper の気の利いた「バッキング フィールドを持つプロパティ」を使用し、バッキング フィールドを静的に設定し、Interface プロパティは非静的のままにしました。うまく構築され、テストは緑色で実行されました。
そのため、再構築も行いましたが、うまくいきました。したがって、これが統合テストに発展するとき、log4net is not serializable の大失敗をこっそり通り過ぎるでしょう。
だから多分これは役立つでしょう
ありがとう
スタート