asp.net core、Ef core:実行時に動的にリポジトリとサービスをマッピングする

asp.net-core asp.net-core-mvc c# dependency-injection entity-framework-core

質問

私は自分のリポジトリクラスをそのインターフェースにマッピングしています。同じことがサービスのためにあります。ここで手動で登録することができます。しかし、私は自分のコードを実行時に動的にマッピングして、新しいリポジトリまたはサービスを作成するたびに手動で登録する必要はありません。それをどうすれば実現できますか?

ここに私のコードです:

public void RegisterDependencies(IServiceCollection services, IConectionSetting connectionSetting)
{
    services.AddDbContext<QuantumDbContext>(options => options.UseSqlServer(connectionSetting.Get()));
    //services.AddDbContext<TestDbContext>(options => options.UseSqlServer(databaseFactory.ConnectionString));
    services.AddTransient<IDatabaseFactory, DatabaseFactory>();
    services.AddTransient<IDbContext, TestDbContext>();
    services.AddTransient<IDbContext, QuantumDbContext>();
    services.AddTransient<IUnitOfWorkManager, UnitOfWorkManager>();
    services.AddTransient<IRepository<CodeTable>, Repository<CodeTable>>();
    services.AddTransient<IRepository<Country>, Repository<Country>>();
    services.AddTransient<IRepository<State>, Repository<State>>();
    services.AddTransient<IRepository<City>, Repository<City>>();

    services.AddTransient<ICodeTableService, CodeTableService>();
    services.AddTransient<ICountryService, CountryService>();
}

人気のある回答

あなたの質問を2つの質問に分けることができます:

1-どのように登録し、DIライブラリを内蔵したasp.netコアのジェネリック型を解決する?

(「 vNext Dependency Injection Generic Interface 」を参照)

services.AddTransient<IRepository<CodeTable>, Repository<CodeTable>>();
services.AddTransient<IRepository<Country>, Repository<Country>>();
services.AddTransient<IRepository<State>, Repository<State>>();

このようなリポジトリを登録するだけです:

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

どのように組み込みのDIライブラリを持つasp.netコアでバッチ登録(慣習に基づく)を実装する方法? ( ASP.NET 5 / MVC 6での規則に基づくバインディングを参照)

services.AddTransient<ICodeTableService, CodeTableService>(); 
services.AddTransient<ICountryService, CountryService>();

私はバッチ登録を実装するために次のコードを使用し、期待どおりに動作しますが、それが良い方法であるかどうかわかりません(この実装では間違ったコードがあるかもしれません):

        // i assume your service interfaces inherit from IService
        Assembly ass = typeof(ICodeTableService).GetTypeInfo().Assembly;

        // get all concrete types which implements IService
        var allServices = ass.GetTypes().Where(t =>
            t.GetTypeInfo().IsClass && 
            !t.GetTypeInfo().IsAbstract &&
            typeof(IService).IsAssignableFrom(t));

        foreach (var type in allServices)
        {           
            var allInterfaces = type.GetInterfaces();
            var mainInterfaces = allInterfaces.Except
                    (allInterfaces.SelectMany(t => t.GetInterfaces()));
            foreach(var itype in mainInterfaces)
            {
                if (allServices.Any(x => !x.Equals(type) && itype.IsAssignableFrom(x)))
                {
                    throw new Exception("The " + itype.Name + " type has more than one implementations, please change your filter");
                }
                services.AddTransient(itype, type);
            }
        } 


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ