読み取り専用の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:ない 重複 :
services.AddScoped(typeof(IRepository<>), ...)
を試行すると、エラー_Using the generic type 'IRepostiory<TIdType,TEntityType>' requires 2 type arguments
_が発生しますこの質問はまだ duplicate として適切にマークされていないため、Genericクラスを登録する方法:
services.AddScoped(typeof(IRepository<,>), typeof(Repository<,>));
これで、次の方法で解決できます。
serviceProvider.GetService(typeof(IRepository<A,B>));
// or: with extensionmethod
serviceProvider.GetService<IRepository<A,B>>();