Nach einigem Hin und her die Kommentare zu anderen Antworten Ich habe eine funktionierende Lösung, es ist vielleicht nicht der beste Weg, aber es funktioniert. Ich werde das Update erneut durchführen, wenn ich eine bessere Möglichkeit finde, dies zu implementieren.
Die beiden Fragen, die ich hatte waren: Wir brauchten eine generische Schnittstelle zu registrieren, das Problem hier war eine Unaufmerksamkeit von mir .. ich falsch die Syntax hatte eine generische Art für die Registrierung, die natürlich ist:
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
Das zweite Problem war, dass ich eine Assembly habe, die 50+ verschiedene Modelle enthält, die ich registriert haben wollte. Die Art, wie ich dies ansprach, war eine Methode zu schreiben, die ich zusammen mit dem Namespace eine Liste von Assemblies übergeben kann zu registrieren und es iteriert über alle Typen, die den Kriterien entsprechen, und registriert sie im DI-Container.
public void RegisterModels(IServiceCollection services, string[] Assemblies, string @NameSpace)
{
foreach (var a in Assemblies)
{
Assembly loadedAss = Assembly.Load(a);
var q = from t in loadedAss.GetTypes()
where t.IsClass && !t.Name.Contains("<") && t.Namespace.EndsWith(@NameSpace)
select t;
foreach (var t in q.ToList())
{
Type.GetType(t.Name);
services.AddTransient(Type.GetType(t.FullName), Type.GetType(t.FullName));
}
}
}
Dies ist dann von der startup.cs Methode ConfigureServices aufgerufen:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<TestContext>(options =>
options.UseSqlServer(@"Server=LOCALHOST\SQLEXPRESS;Database=Test;Trusted_Connection=True;"));
services.AddMvc();
RegisterModels(services, new string[] { "UI" }, "UI.Models");
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
}
Es gibt einen besseren Weg, dies zu tun sein mag, es ist auf jeden Fall anders DI-Container verwenden, wenn jemand Verbesserungen zu bieten hat lass es mich wissen, bitte.
Es sei denn, ich vermisse etwas. Warum müssen Sie Ihre Viewmodels mit DI registrieren? – testydonkey
Sie haben recht, das ursprüngliche Problem war, dass ich das generische Repository nicht registrieren konnte, ohne einen Typ anzugeben, der mich zu einem Pfad führte, wo es vorgeschlagen wurde, dass dies in der .net 5 DI nicht möglich ist Container - also habe ich angefangen, Wege zu finden, um die Arbeit zu minimieren, um alle verschiedenen Arten von generischen Repo zu registrieren, die ich benötigen würde ... Wie auch immer Sie sind, die RegisterModels Methode wird nicht benötigt - Ive es gelassen, wie es nützlich sein kann für andere, die eine Anzahl von Klassen innerhalb eines Namensraums registrieren wollen, wird Ill bearbeitet, um das klarer zu machen. – D3vy
plus 1 für 'loadedAss' –