2

プロジェクトのデータアクセス部分をWebAPIに移動し、Entity Framework Coreを使用してEFの機能を実行します。リポジトリパターンによる依存性注入を実装する混乱 - C#EFコア

「コントローラー」が使用されているときに、優先パターンが依存関係注入を使用してdbContextを作成することが望ましいことを知っています。 「こんにちは、世界!」チュートリアルでは、以下により、コンテキストにアクセスする例を示します。

private BloggingContext _context; 

    public BlogsController(BloggingContext context) 
    { 
     _context = context; 
    } 

私がいる問題は、私は方法を公開し、「サービス」のインターフェースを持っているように、私は...一つの層を上に行く必要がありますリポジトリ。

コンテキストインスタンシエーションを自分のリポジトリに入れてみましたが、もちろん、サービスのインスタンスを新規作成しようとしたときに、コンテキストオブジェクトを渡す必要がありました。送信で解決しようとしました新しいBloggingContext()をコンテキストパラメータとして使用しましたが、エラーが発生しました:No database provider has been configured for this DbContext.私が渡していたnewには関連付けられているデータベースに接続されていないため、当然意味があります。この接続はStartup.csで定義されています。この移行で私の歯を切ってみようとしているさまざまなチュートリアルで説明されています。

私のコントローラに次のコードがあると、どのようにしてサービスを呼び出すことができますが、依然としてDependency Injectionがリポジトリレベルで行うように設計されていますか?

[HttpGet("{bool}")] 
    public IActionResult GetRoleNames(bool? isActive) 
    { 
     var service = new SecurityService(); 
     try 
     { 
      return Ok(service.GetRoleNames(isActive)); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("Failed to get list of role names from the API", ex.Message); 
      return BadRequest(ex); 
     } 
    } 

は、私はNULLを可能にするだけでなくGetRoleNames以来[HttpGet("{bool}")]ビットFUBARdを持っているかなり確信しているが、私はDIの問題を解決した後、その橋を渡ります。

+0

タイプミス、変化属性 '[HTTPGET( "{のisActive?}")]あなたはそのブリッジ – Nkosi

+0

おかげで、@Nkosiに達したときに' ...私は1つ上の助けに感謝!私はそれが次に私をかむだろうと思った。 – rcastagna

答えて

2

使用依存性の注入は、あなたのサービスを作成するには(私はインターフェイスを持ちたい) -

private readonly ISecurityService _service; 

public BlogsController(ISecurityService service) 
{ 
    _service = service; 
} 

構築サービスを使用して

[HttpGet("{bool}")] 
public IActionResult GetRoleNames(bool? isActive) 
{ 
    try 
    { 
     return Ok(_service.GetRoleNames(isActive)); 
    } 
    catch (Exception ex) 
    { 
     Log.Error("Failed to get list of role names from the API", ex.Message); 
     return BadRequest(ex); 
    } 
} 

あなたのセキュリティサービスは、コンテキストが

注入することができ、あなたのメソッドを呼び出します
private readonly BloggingContext _context; 

public class SecurityService : ISecurityService 
{ 
    public SecurityService (BloggingContext context) 
    { 
     _context = context 
    } 
} 

サービスは、Startup.csでConfigureS方法ervices:コード内

service.AddScoped<ISecurityService, SercurityService>(); 
+0

ありがとう@mcbowes!それはほとんどそのトリックでした...私は、サービスのコンストラクタ内のリポジトリにコンテキストを渡さなければなりませんでしたが、それは動作しました。そして、私は自分のコントローラーでインターフェイスを呼び出すように切り替えました。 SecurityServiceの具体的な実装をインスタンス化するときに私が何を考えていたかは不明ですが、今修正されています。 – rcastagna

関連する問題