2017-09-23 28 views
2

私は、パラメータのないコンストラクタを必要とする既存のクラスを持っています。私はその中からエラーや他のデータを記録したい。私のアプリのどこにいても、私はILoggerFactoryを私のコンストラクタに入れてDIがそれを処理しているので、私はログをとることができます。この場合、パラメータのないコンストラクタの必要性のために私はそれを行うことができません。依存性注入を使用せずにILoggerFactoryをインスタンス化する方法

ILoggerFactoryのインスタンス、または自分のスタートアップクラスからDependency Injectionストリームに入れた他のクラスを作成できますか?

+4

このような場合は、既存のクラスのファクトリクラスを登録する必要があります。クラスを構築してパブリックプロパティを設定するか、ILoggerを注入するpublicメソッドを呼び出します。 –

+0

どのようにクラスを使用していますか? ILoggerFactoryのパブリックプロパティを定義できますか?このプロパティをクラス外から設定しますか? – Nikolaus

+0

@Nikolaus私はクラスを自立しないように書き直して、ILoggerFactoryを '得ることができます。 – Grandizer

答えて

2

Configure(Startup.csで)では、渡されたIApplicationBuilderが取得され、ApplicationServicesプロパティ(IServiceProvider)を持ちます。

あなたは簡単に

public void Configure(IApplicationBuilder app) 
{ 
    GetMeSomeServiceLocator.Instance = app.ApplicationServices; 
} 

public static class GetMeSomeServiceLocator 
{ 
    public static IServiceProvider Instance { get; set; } 
} 

ような何かを行うことができますし、後で、どこかに全く関係のない、

public void SomeRandomMethod() 
{ 
    var service = GetMeSomeServiceLocator.Instance.GetService<MyAwesomeService>(); 

    // Do something with service 
} 

を行うことは恐ろしいアンチパターンだし、あなたがが、これを行うべきではありません。

恥知らずに盗まれたhttps://github.com/aspnet/DependencyInjection/issues/294(後に残るように)

+0

'var lf = ServiceInstantiator.Instance.GetService ();'しかし、エラーを取得しました。非汎用メソッドIServiceProvider.GetService(Type)は型引数で使用できません'。しかし、この 'var lf = ServiceInstantiator.Instance.GetService(typeof(ILoggerFactory))'はコンパイルされますが、できません: 'lf.CreateLogger ();' – Grandizer

+0

@Grandizer '; ILoggerFactory'を'; ' – Nikolaus

+2

おそらくusingステートメントを使用していない場合、GetService <>メソッドは実際には拡張メソッドです。 –

関連する問題