2016-10-11 19 views
0

よりも、私のサービスを宣言するための適切な方法があります:ASP.NETコアと依存性注入

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])); 
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], new Logger(Configuration["..."]))); 

私は「新しいロガー」2倍を宣言する避けたいです。

編集:カタログサービスもコンストラクタ内の文字列を受け取ります。

public CatalogService(ILogger logger, string path) 
{ 
} 

public Logger(string value) 
{ 
} 
+0

はすばらしく見える、これを知らない! – Tim

答えて

3

これは動作するはずです。このようなものがあるでしょう

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])) 
services.AddTransient<ICatalogService, CatalogService>(); 

クラスCatalogServiceでは:あなたはすでに実装を登録してきたように

public class CatalogService(ILogger logger) { 
... 
} 

ILogger、th e IOCは自動的にCatalogServiceクラスで使用するインスタンスを作成します。

EDIT:エディションごとに、毎回new Configurationを注入する必要はありません。 IConfigurationの実装を登録するだけで、必要なときに自動的に注入されます。私がテストしていませんが、このようなものでなければなりません:ところで

services.AddSingleton<IConfiguration>(Configuration); 
services.AddTransient<ILogger, Logger>() 
services.AddTransient<ICatalogService, CatalogService>() 

this linkはあなたを助けることができます。

+0

申し訳ありませんが、私の質問は十分正確ではありませんでした。私はprecsionsを追加しました – Tim

+0

@Tim:あなたの 'Configuration'を別々に登録してください。 – Steven

+0

あなたはIOptionsパターンを意味しますか? – Tim

1

可能であればIOption<T>パターンを使用する必要があります。詳しくは、the documentationを参照してください。

IOptions<T>パターンを使用できない場合(つまり、サードパーティライブラリまたはこのパターンをサポートしないレガシーライブラリで定義されているロガー)、工場出荷時の方法でロガーを解決できます。

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])); 
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>())); 

このようにして、ロガーは以前に設定された設定から解決されます。これがproviderがファクトリメソッドに渡される理由です。