2

Web API、.Net Core、およびEntityFramework Coreを使用してサービスアプリケーションを構築しています。 Startup.csに「ConfigureServices」の方法で、私はこれらの行を使用しています私のDbContextのオプションを設定するためのエンティティフレームワークコアDbContextと依存性注入

var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;"; 
services.AddDbContext<EMContext>(options => options.UseSqlServer(connection)); 

私が知っている私は、コントローラ内のコンストラクタのパラメータとしてコンテキストを追加する場合、.NETということコンストラクタにコンテキストを挿入します。

しかし、これは私が望む動作ではありません。私は自分のWeb APIにdbcontextについて何も知らせたくありません。すべてのCRUD操作を処理するリポジトリクラスを持つDataAccessプロジェクトがあります。

これは私のコントローラにRepository.AddEvent(evt)と言うだけで、それを処理する方法を知っていることを意味します。

一方、リポジトリは単純な依存関係リゾルバを使用して適切な "IDataAdapter"実装を取得します。これらの実装の1つはSQLDataAdapterです。これが私の文脈が必要なポイントです。

どのようにして私のコンテキストをこの時点まで渡すことができますか?

答えて

5

これは、データアクセス層のクラスにコンストラクタインジェクションを介してdbcontextを追加することで解決できます。

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(myConnStr)); 
     services.AddScoped<Repository>(); // 'scoped' in ASP.NET means "per HTTP request" 
    } 
} 

public class MvcController 
{ 
    private Repository repo; 
    public MvcController(Repository repo) 
    { 
     this.repo = repo; 
    } 

    [HttpPost] 
    public void SomeEndpoint() 
    { 
     this.repo.AddFoo(new Foo()); 
    } 
} 

public class Repository 
{ 
    private DbContext db; 
    public Repository(ApplicationDbContext db) 
    { 
     this.db = db; 
    } 

    public void AddFoo(Foo obj) 
    { 
     this.db.Set<Foo>().Add(obj); 
     this.db.SaveChanges(); 
    } 
} 

あなたは、さらにあなたのDbContextは、あなたのDIコンテナ内に注入される方法をカスタマイズしたい場合は、私はあなたが実際に何をしているのか.AddDbContextで見てください。 https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158