Ich habe eine alte .NET-Anwendung, die Ninject verwendet, um eine Instanz eines ICommandHandler aufzulösen, wie unten gezeigt. Ich verwende auch den DB-Kontext, um SaveChanges() aufzurufen. Ich versuche jetzt, diesen Code zu konvertieren, damit ich ihn in einer neuen .NET Core-Anwendung mit seiner integrierten Abhängigkeitsinjektion verwenden kann.Ersetzen Sie Ninject durch .NET Core integrierte DI mit typisierten Parametern
public class CommandInvoker : ICommandInvoker
{
private readonly IKernel _kernel;
private readonly IArhomaContext _context;
public CommandInvoker(IKernel kernel, IArhomaContext context)
{
_kernel = kernel;
_context = context;
}
public void Execute<T>(T command)
{
var handler = _kernel.TryGet<ICommandHandler<T>>();
handler.Handle(command);
_context.SaveChanges();
}
}
Ich denke, dass ich folgendes an die ConfigureServices Methode in Startup.cs hinzufügen:
services.AddScoped<ICommandHandler, CommandHandler>();
Aber ICommandHandler hat eine typisierte Parameter. Wie wird das gemacht oder registriert?
Zweitens muss ich es auflösen, um einen Handler zu erstellen, der den Befehl ausführt. Wie löst man das in .NET Core?
P.S. Ich möchte Ninject nicht weiter in meiner .NET Core App verwenden.
'' 'services.AddScoped (typeof (ICommandHandler <>), typeof (CommandHandler <>));' '' –
Danke Luke aber wie löse ich es? In Ninject gibt es den Kernel.TryGet <>, aber wie wird das in Core gemacht? – Ray
Wahrscheinlich verwenden Sie die Stapelregistrierungsfunktion von Ninject, um alle Ihre Befehlshandler mit einem Aufruf zu registrieren. Dies ist etwas, das der Microsoft-Container nicht hat. Dies ist etwas, das Sie selbst erstellen müssen, oder Sie müssen ein Drittanbieter-Tool verwenden, das dies über den .NET Core-Container tun kann. Beachten Sie, dass in .NET Core viele Funktionen fehlen, die für Ihre Anwendung wichtig sein könnten. Die Umstellung auf diese sehr einfache DI-Implementierung liefert möglicherweise nicht immer die besten Ergebnisse. – Steven