2017-06-29 1 views
0

私はAspNet Core 1.1アプリケーションでOptionsパターンを使用しています。すべてはマニュアルに従って設定されます。AspNet Core 1.1クラスにIOを注入する

public Startup(IHostingEnvironment env) 
 
     { 
 
      var builder = new ConfigurationBuilder() 
 
       .SetBasePath(env.ContentRootPath) 
 
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
 
       .AddEnvironmentVariables(); 
 
      Configuration = builder.Build(); 
 
     } 
 
     
 
public void ConfigureServices(IServiceCollection services) 
 
     { 
 
      ... 
 
      services.Configure<AppOptions>(Configuration); 
 
      ... 
 
     }

私が作成していたサービスにAppOptionsクラスを注入したいと思います:

public class MyService 
 
{ 
 
private readonly AppOptions options; 
 
    public MyService(IOptions<AppOptions> optionsAssesor) 
 
     { 
 
      options = optionsAssesor.Value; 
 
     } 
 
    
 
    ... 
 
}

私の質問は:MyServiceのインスタンスを作成しようとするとクラスのよう:

MyService svc = new MyService();

私はDIを活用し、AppOptionsを注入することができますどのように必要な仮パラメータoptionsAssesorに対応して与えられた引数がありませんというエラーを取得しています私のサービスに?

私は.NET Coreの新機能を使用していますので、私は単純なものが欠けていると推測していますが、何が分かりません。

ありがとうございます。

+0

使用しようとしているjsonオブジェクトを投稿できますか? –

答えて

1

MyServiceのインスタンスをどこから取得しようとしているかによって異なります。基本的には、サービスコレクションへの参照を取得し(起動時にDIにMyServiceを登録する)、サービスプロバイダを構築してサービスを取得する必要があります。これにより、DIはMyServiceのインスタンスを構築し、それをAppOptionsのインスタンスに渡すことができます。言われていること

var provider = serviceCollection.BuildServiceProvider(); 

var myService = provider.GetService<MyService>(); 

、ASP.NETコアのほとんどの場所でこれを実行する必要があり、なしコントローラ/ミドルウェアコンストラクタを通じてMyServiceでのインスタンスを取得したほうが良いですしていない。例えば

あなた自身でサービスプロバイダを構築する必要があります。

さまざまなサービスライフタイムをさらに理解するには、ASP.NETコアの依存性注入に関するMicrosoftドキュメントを参照してください。

2

サービス(MyService)がASP.netコアプロジェクトの範囲内にあると仮定しています。

あなたは以下のことを行う必要があります。今

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddScoped<MyService>(); 
    ... other things 
} 

、あなたのサービスを使用している(または、あなたが依存関係を通過する必要がありますように

public class HomeController : Controller 
{ 
    private MyService _myService = null; 
    public HomeController(MyService service) 
    { 
     _myService = service; 
    } 
    // now you can use _myService in your controller method. 
} 

すべてのことを行う必要があり、あなたのサービスいくつかのコントローラを使用するとします。

更新1

ここで別のクラスで使用したいとします。

たとえば、別のクラスはMyClass1です。あなたはその後、MyClass1一つの方法または他のそれがコントローラによって使用されますASP.netコアを使用している場合

public class MyClass1 
{ 
    private MyService _myService = null; 
    public MyClass1(MyService service) 
    { 
      _myService = service; 
    } 
} 

は今、私は、正しい考えています。このために依存関係を登録する必要があります。

services.AddScoped<MyClass1>(); // This should be in your ConfigureServices. 
+0

私は実際にMyServiceをコントローラではなく別のクラスで使用しようとしています。そこでMyServiceの新しいインスタンスを作成しようとするとエラーが発生します – dpdragnev

+0

そのクラスでは、コントローラに指定したのと同じ方法で使用できます。私は私の例のビットを更新しています。 – dotnetstep

関連する問題