2017-08-02 9 views
3

私は、ソリッドの原則に向けたリファクタリングが真剣に必要なレガシーコードベースに取り組んでいます。シンプルインジェクタ依存性注入コンテナを最初のステップとしてミックスに追加します。私は非常にlog4netの、すなわちのためのRegisterConditional例のようなものを必要とする登録のいずれかのSimple InjectorはTypeFactoryContextと組み合わせてインスタンスファクトリに登録する方法を持っていますか?

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Singleton, 
    c => true); 

違いは、私がc.Consumerをとるファクトリメソッドから返されたインスタンスを注入したいということです.ImplementationTypeを入力:

container.Register???(
    typeof(ILogger), 
    c => LoggerProvider.GetLogger(c.Consumer.ImplementationType), 
    Lifestyle.Transient); 

これはSimple Injectorで実行できますか?

私はa similar questionの回答を読んでいますが、それだけでは不十分です。 ImplementationTypeはインスタンスファクトリに渡す必要があります。

当分の間、私は > ロガー< TParentを実装し、RegisterConditionalコールにすることを使用します。

public class Logger<TParent> : ILogger 
{ 
    private readonly ILogger _decoratedLogger; 

    public Logger() 
    { 
     _decoratedLogger = Logger.GetLogger(typeof(TParent)); 
    } 
} 
+1

「シンプルインジェクタ依存性注入コンテナを最初のステップとして追加します。」後でDIコンテナを使い始めることもできます。参照:https://stackoverflow.com/a/32033648/264697 – Steven

+0

良い点。私たちは、Pure DIのための簡単な瞬間のために行くことを検討しました。ただし、コードベースは複数のアプリケーションに使用されます。それぞれ保守性を急速に損なう構成ルートが必要です。 – AroglDarthu

答えて

3

これは単純なインジェクターで達成することができますか?

はい、いいえ。

  • ませない、これはRegisterConditionalを使用してサポートし、それは可能な限り確認し、オブジェクトグラフを診断することができるようにシンプルなインジェクターは、登録の種類に向けてあなたをプッシュするためにしようとするためですされていません。好ましい方法は、hereと同様にプロキシクラスを作成することです。基本的に現在のソリューションについて説明していますが、代わりにLogImpを継承するLogger<T>があります。これは簡単な解決策につながります。

  • はい、これは可能ですが、(例はSerilogのためですが、簡単にlog4netのに書き換えることができる)here説明したように、カスタムIDependencyInjectionBehaviorを使用してに戻す必要があります。しかし、可能であれば第1の方法が好ましい。

+0

"ですが、代わりにLogImpを継承するLogger があります。 まさにそのことを終わらせました;-) – AroglDarthu

関連する問題