Salta ai contenuti

Moongate.Hosting

Il livello host generico di Moongate: servizi di avvio, un bus degli eventi, un registro dei plugin, sezioni di configurazione TOML e i contratti di game loop, timer, diagnostica e arresto. Dipende solo da Moongate.Core, quindi un’applicazione può usarlo senza lo stack di Ultima Online.

Richiede .NET 10. Usa la versione del pacchetto disponibile nel feed NuGet configurato.

Terminal window
dotnet add package Moongate.Hosting

  • IMoongateService e IMoongateStartupService, i contratti di un servizio e di uno che si avvia e si ferma con l’host.
  • Un bus degli eventi integrato con DryIoc e gli eventi di avvio, arresto in corso e arresto avvenuto.
  • Un contratto per i plugin (IMoongatePlugin), i suoi metadati e le sue dipendenze, e il registro che ordina i plugin e ne chiama Register; l’host che li esegue sta in Moongate.Server.
  • Sezioni di configurazione TOML (IConfigSection) lette da un documento e registrate nel contenitore.
  • Contratti e opzioni per game loop, timer, diagnostica e fornitori di metriche, e per la richiesta di arresto.

Una piccola applicazione costruita solo su Moongate.Hosting: un file di configurazione condiviso con i plugin, un bus degli eventi, un servizio che parte con l’host e un plugin che registra la propria sezione di configurazione. L’esempio avvia il servizio e pubblica a mano l’evento del ciclo di vita; non esegue un host né un game loop.

using DryIoc;
using Moongate.Server.Core.Data.Config;
using Moongate.Server.Core.Data.Events;
using Moongate.Server.Core.Data.Plugins;
using Moongate.Server.Core.Extensions;
using Moongate.Server.Core.Interfaces.Events;
using Moongate.Server.Core.Interfaces.Plugins;
using Moongate.Server.Core.Interfaces.Services;
using Tomlyn;
using Tomlyn.Model;
using var container = new Container();
// The parsed configuration file, shared with the plugins that own a section of it.
var toml = "[greeting]\ntext = \"Hello\"\n";
container.RegisterInstance(new ServerConfigDocument("moongate.toml", TomlSerializer.Deserialize<TomlTable>(toml)!, []));
container.RegisterMoongateEventBus();
// A service the host starts and stops, and a plugin that registers its configuration section.
container.AddMoongateService<IGreeter, Greeter>(priority: 5);
container.RegisterMoongatePlugin(new GreetingPlugin());
var bus = container.Resolve<IMoongateEventBus>();
using var subscription = bus.Subscribe<MoongateStartedEvent>((_, cancellationToken) =>
{
Console.WriteLine("Started");
return Task.CompletedTask;
});
// A host starts each registered service and then announces that it has started.
await ((IMoongateStartupService)container.Resolve<IGreeter>()).StartAsync();
await bus.PublishAsync(new MoongateStartedEvent());
public interface IGreeter : IMoongateService;
public sealed class Greeter(GreetingConfig config) : IGreeter, IMoongateStartupService
{
public Task StartAsync()
{
Console.WriteLine(config.Text);
return Task.CompletedTask;
}
public Task StopAsync() => Task.CompletedTask;
}
public sealed class GreetingConfig
{
public string Text { get; set; } = "default";
}
public sealed class GreetingPlugin : IMoongatePlugin
{
public MoongatePluginData Metadata { get; } = new("greeting", "Greeting", new(1, 0, 0));
public void Register(Container container) => container.AddConfig<GreetingConfig>("greeting");
}

SubscribeAll registra un gestore invocato per ogni evento pubblicato, indipendentemente dal tipo, eseguito dopo gli iscritti tipizzati dell’evento, nell’ordine di iscrizione. Ogni iscrizione generale è indipendente e restituisce un proprio token rilasciabile, esattamente come Subscribe<TEvent>; rilasciarne una non influisce mai su un’altra.

I tipi mantengono gli spazi dei nomi che avevano in Moongate.Server.Core (Moongate.Server.Core.Interfaces.Services, Moongate.Server.Core.Extensions e così via), quindi il codice sorgente scritto per quel pacchetto continua a compilare. I binari costruiti con un Moongate.Server.Core precedente vanno ricompilati, perché i tipi ora stanno in un altro assembly (e i plugin richiedono già la versione esatta dell’host). Potrebbero essere rinominati in una release successiva.

Questo pacchetto dipende da Moongate.Core; DryIoc, Serilog e Tomlyn arrivano tramite esso. Non ha riferimenti alle librerie di rete, pacchetti, persistenza o Ultima.

Le implementazioni di loop, timer e diagnostica, e l’host eseguibile, sono fornite da Moongate.Server, che non viene distribuito come pacchetto libreria. Fare riferimento a questo pacchetto non avvia un host, timer o un game loop.

Distribuito con licenza AGPL-3.0-or-later. Vedi il repository sorgente e la licenza.

Creato con ❤️ da Tom

Offrimi un caffè