.NET Core ist jetzt Standard
Sie können jetzt Assemblies für .NET 6, .NET 8 und .NET 9 kompilieren. Wenn Sie tatsächlich noch ein altes Framework-Projekt unterstützen wollen, können Sie Ihre Assemblies für .NET Standard 2.0 kompilieren, wenn Sie nicht weiterhin NDO 4 verwenden wollen.
NDO 5 unterscheidet sich im Kern nicht von NDO 4, außer in Hinblick auf das Logging und die DependencyInjection. NDO 4 wird allerdings keine weitere Entwicklung erfahren.
Sie brauchen zwei Packages
Das Package NDO.dll enthielt in der Vergangenheit alles, was Sie zum Kompilieren Ihrer Assemblies benötigten. Der Assembly-Enhancer ist jetzt in einem neuen Package NDO.build, das Sie in Ihre Projekte einbinden müssen.
Symbol Packages
Beim Erstellen der NDO-Packages wird nun eine spezielle Package-Datei mit der Endung .snupkg erzeugt. Diese enthält den Source Code und die Symbole, sodass Sie in NDO debuggen können, ohne den Source Code kompilieren zu müssen.
Sie brauchen einen Host
NDO unterstützt nun die DependencyInjection von Microsoft. Dafür brauchen Sie einen Host und müssen in der Initialisierungsphase des Hosts AddNdo und BuildNdo aufrufen. Für eine simple Konsolenanwendung können Sie folgende Basisklasse nutzen:
internal class HostedProgram
{
protected IHost host;
public HostedProgram()
{
var builder = Host.CreateDefaultBuilder();
builder.ConfigureServices( services =>
{
services.AddLogging( b =>
{
b.ClearProviders();
b.AddConsole()
.AddFilter( "NDO", LogLevel.Debug );
} );
services.AddNdo( null, null );
} );
this.host = builder.Build();
this.host.Services.UseNdo();
}
}
Sie müssen dann in der abgeleiteten Klasse mit Instanz-Methoden arbeiten, damit der Konstruktor wirksam werden kann.
Scopes in der DependencyInjection
Wenn Sie den PersistenceManager instanzieren, wird der ServiceProvider genutzt, der bei der Systeminitialisierung vorlag. In Web-Applikationen wollen Sie aber den ServiceProvider des Requests nutzen, um "scoped" Instanzen ihrer Services zu erhalten. Den scoped ServiceProvider erhalten Sie in einem Controller oder in einer Razor-Page via DependencyInjection und können diesen an den PersistenceManager übergeben. Dieser kann dann beim Anlegen von Objekten den Scope berücksichtigen.
public class MyController : ApiController
{
private readonly IServiceProvider serviceProvider;
public MyController (IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
...
[HttpGet]
public IActionResult GetSomeData()
{
var pm = new PersistenceManager(this.serviceProvider);
var result = pm.Objects<SomeClass>().Where(c=>c.....).ResultTable();
// if SomeClass has a constructor parameter which is a scoped service,
// it will get the right parameter from the serviceProvider.
}
}