3

Ich habe meine Repository-Klasse auf seine Schnittstelle gemappt und dasselbe gilt für Dienste. Hier könnte ich sie manuell registrieren. Aber ich möchte, dass mein Code diese dynamisch in der Laufzeit abbildet, so dass ich sie nicht jedes Mal manuell registrieren muss, wenn ich ein neues Repository oder einen neuen Service erstelle. Wie kann ich das erreichen?asp.net core, Ef-Kern: Repository und Dienste in Laufzeit dynamisch zuordnen

Hier ist mein Code:

public void RegisterDependencies(IServiceCollection services, IConnectionSetting 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>(); } 

Antwort

1

Lassen Sie mich teilen Sie Ihre Frage in zwei Frage:

1- Wie generische Typen in asp.net Kern mit integrierten DI-Bibliothek registrieren und lösen ?

(siehe vNext Dependency Injection Generic Interface)

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

Sie einfach Repositorys wie folgt registrieren:

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

2- Wie batch registration (Konvention basiert) in asp.net Kern mit eingebautem in implementieren DI-Bibliothek? (Siehe Convention based binding in ASP.NET 5/MVC 6)

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

Ich verwende folgender Code batch registration zu implementieren und es funktioniert wie erwartet, aber ich bin nicht sicher, ob es guter Weg ist, (da in dieser Implementierung falscher Code sein kann):

 // 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); 
      } 
     } 
Verwandte Themen