3

.NET Framework 2.0を対象とする2つのプロジェクトProductStore.WebとProductStore.Dataを持つC#ソリューションがあります。DbContext MVCプロジェクト外の依存性注入

次のように私は私にHomeControllerとCustomerRepositoryを持っている(私はスピードのためにHomeControllerでそれを設定した、顧客の作成は、顧客のコントローラであってもよいが、まだ足場-EDそれをします):

namespace ProductStore.Web.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private readonly DatabaseContext _context; 

     public HomeController(DatabaseContext context) 
     { 
      _context = context; 
     } 
     public IActionResult Index() 
     { 
      ICustomerRepository<Customer> cr = new CustomerRepository(_context); 
      Customer customer = new Customer 
      { 
       // customer details 
      }; 
      //_context.Customers.Add(customer); 
      int result = cr.Create(customer).Result; 
      return View(); 
     } 
    } 
} 

namespace ProductStore.Data 
{ 
    public class CustomerRepository : ICustomerRepository<Customer> 
    { 
     DatabaseContext _context; 
     public CustomerRepository(DatabaseContext context) 
     { 
      _context = context; 
     } 
    } 
} 

依存性注入は_contextをコントローラ内で自動的に解決します。次に、ProductStore.DataにあるCustomerRepositoryのパラメータとしてコンテキストを渡します。

私の質問は2倍です:

  1. はこのベストプラクティス(コントローラからCustomerRepositoryにコンテキストを渡す)
  2. ない場合のベストプラクティスですが、私はどのように似た方法でIServiceCollection servicesを通してコンテキストにアクセスすることができますDatabaseContextは、アプリケーションのStartUp.csクラスのサービスに挿入されます。

コンテキストを渡す必要はないはずですが、CustomerRepositoryはコンテキストを取得する必要があります。あなたは、リポジトリ内のサービスに登録さcontextを使用できるようにcontrollercontextを渡す必要はありません

おかげ

+0

なぜ 'context'を' repository'に直接挿入しないのですか? –

+0

@RubenVardanyan thats私が求めていること。リポジトリ内から新しいコンテキストオブジェクトを作成することはできますが、アプリケーションサービス内にコンテキストがすでに存在する場合は、再利用する必要があると感じていますか? – Dave0504

+0

以下の回答を参照してください –

答えて

3

比較的MVCに新しいとEntity Frameworkのと依存性注入の新ブランドFYI

、 。私がそれをやりたい方は、次のとおりです。 contextrepositoryに注入し、コントローラにrepositoryを注入します。ネットコアの中のMicrosoft依存性の注入拡張機能を使用して、彼が見ているHomeControllerに注入するICustomerRepositoryを解決しようとDependencyResolverとき、それはこの後、この

// Service registrations in Startup class 
public void ConfigureServices(IServiceCollection services) 
{ 
    // Also other service registrations 
    services.AddMvc(); 
    services.AddScoped<DatabaseContext, DatabaseContext>(); 
    services.AddScoped<ICustomerRepository<Customer>, CustomerRepository>(); 
} 

// Controller 
namespace ProductStore.Web.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private readonly ICustomerRepository _customerRepository; 

     public HomeController(ICustomerRepository customerRepository) 
     { 
      _customerRepository = customerRepository; 
     } 
     public IActionResult Index() 
     { 
      Customer customer = new Customer 
      { 
       // customer details 
      }; 
      //_context.Customers.Add(customer); 
      int result = _customerRepository.Create(customer).Result; 
      return View(); 
     } 
    } 
} 

//Repository 
namespace ProductStore.Data 
{ 
    public class CustomerRepository : ICustomerRepository<Customer> 
    { 
     DatabaseContext _context; 
     public CustomerRepository(DatabaseContext context) 
     { 
      _context = context; 
     } 
    } 
} 

のようになります、ICustomerRepositoryの登録実装(我々の場合CustomerRepositoryに)DatabaseContextの登録サービスを取得し、あなたのConfigureServices METであなたのリポジトリを定義する場合CustomerRepository

+1

コードスニペットは汎用クラスのためには機能しません – Yaser

+0

@Yaser、はいジェネリックスの一部を見逃しました。しかし、この場合、インターフェースは一般的であり、実装ではありません。したがって、このアプローチはうまくいくはずです。 –

+0

それは私が==コンパイルエラーではないと信じるでしょう – Yaser

3

にそれを注入するためにしようとしている一つのパラメータとしてDatabaseContextを必要とするコンストラクタとDependencyResolverを持っています

public void ConfigureServices(IServiceCollection services) 
 
{ 
 
    services.AddDbContext<DbContext>(options => 
 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
 
     
 
    services.AddScoped(typeof(ICustomerRepository<>), typeof(CustomerRepository<>)); 
 
}

次に、あなたは、単にコントローラにリポジトリを注入することができます:

public class HomeController : Controller 
 
{ 
 
    private readonly ICustomerRepository _customerRepository; 
 

 
    public HomeController(ICustomerRepository customerRepository) 
 
    { 
 
     _customerRepository = customerRepository; 
 
    } 
 
    ... 
 
}
HOD、あなただけのリポジトリ、コントローラに DbContextを注入する必要はありません

依存インジェクタは、あなたのリポジトリにDbContextを注入してください。

1

1。私はあなたが「作業ユニットの」パターンのようなものを探していると思います。このベストプラクティス(コントローラからCustomerRepositoryにコンテキストを渡す)

です。

マイクロソフトでは、​​の作成に関するチュートリアルを作成しました。

コンテキストの代わりに、コントローラにリポジトリを挿入します。

2.ないベストプラクティス場合、私は... DatabaseContextは自分のアプリケーションのStartUp.csクラスのサービスに挿入されている方法と同じようにIServiceCollectionサービスを経由してコンテキストにアクセスすることができます

私が正しくあなたを理解すれば、そうすることができます。また、 CustomerRepositoryをStartUp.csのサービスに追加し、コントローラ内で を使用することができます。

Mabye this Microsoftからのチュートリアルもお手伝いします。