web-dev-qa-db-ja.com

一般的な依存性注入を追加する方法

読み取り専用のapiサービスに取り組み、ジェネリックを利用して操作をコンベンションベースのプロセスにパッケージ化します。

リポジトリインターフェイス:

_public interface IRepository<TIdType,TEntityType> where TEntityType:class {
   Task<EntityMetadata<TIdType>> GetMetaAsync();
}
_

リポジトリの実装:

_public class Repository<TIdType,TEntityType> : IRepository<TIdType,TEntityType> where TEntityType:class {
   public Repository(string connectionString) { // initialization }
   public async Tas<EntityMetadata<TIdType>> GetMetaAsync() { // implementation   }
}
_

_Startup.cs -> ConfigureServices_内:

_services.AddSingleton<IRepository<int, Employee>> ( p=> new Repository<int, Employee>(connectionString));
services.AddSingleton<IRepository<int, Department>> ( p=> new Repository<int, Department>(connectionString));
// and so on
_

コントローラ:

_public class EmployeeController : Controller {
   public EmployeeController(IRepository<int,Employee> repo) {//stuff}
}
_

現在、ConfigureServicesのすべてのタイプのエンティティタイプに対してリポジトリ実装を繰り返しています。これもジェネリックにする方法はありますか?

_services.AddSingleton<IRepository<TIdType, TEntityType>> ( p=> new Repository<TIdType, TEntityType>(connectionString));
_

コントローラのコンストラクタ呼び出しで、関連するリポジトリを自動的に取得できますか?

更新1:ない 重複

  1. リポジトリの実装にはデフォルトのコンストラクタがありません
  2. デフォルトのコンストラクターがないため、リンクされた質問で与えられた解決策を提供できません。
  3. services.AddScoped(typeof(IRepository<>), ...)を試行すると、エラー_Using the generic type 'IRepostiory<TIdType,TEntityType>' requires 2 type arguments_が発生します
10
Vijay

この質問はまだ duplicate として適切にマークされていないため、Genericクラスを登録する方法:

services.AddScoped(typeof(IRepository<,>), typeof(Repository<,>));

これで、次の方法で解決できます。

serviceProvider.GetService(typeof(IRepository<A,B>));
// or: with extensionmethod
serviceProvider.GetService<IRepository<A,B>>();
15
Joel Harkes