461 messaggi dal 08 febbraio 2009
Buongiorno.

In ASP.NET core, di default, vengono utilizzati i seguenti metodi per configurare la DI e il Routing:

- ConfigureService(IServiceCollection services): si configura la DI
- Configure(IApplicationBuilder app): si configura l'app, fra cui il routing


Ho quindi creato un middleware personalizzato che accetta un'interfaccia nel costruttore, in modo che gli venga passata la classe concreta mediante DI.

Quello che vorrei ottenere è di poter configurare lo stesso middleware su due route, facendo però in modo che il motore di DI istanzi una classe nella prima route, mentre ne instanzi un'altra nella seconda.


Facciamo un esempio pratico.
Partiamo dalla definizione del middleware e delle classi che ci stanno attorno:


public class DbMiddleware
{

   public DbMiddleware(RequestDelegate next, IDatabase db)
   {
      ...
   }

}


public interface IDatabase 
{
   Name { get; }

   ...
}


public class OracleDatabase : IDatabase
{
   public Name { get; } => "Oracle";

  ...
}


public class SqlDatabase : IDatabase
{
   public Name { get; } => "SqlServer";

   ...
}




Come si può vedere, c'è un unico middleware (DbMiddleware) che può lavorare con diversi tipi di database, l'importante è che venga rispettata l'interfaccia IDatabase.

Ora vorrei configurare due route diverse, la prima che lavori con Sql Server, la seconda che lavori con Oracle.

Lato routing la cosa è abbastanza semplice, basta intervenire nel metodo Configure:



public void Configure(IAppplicationBuilder app)
{
   ...

   app.UseRouter(BuildRouter(app));
   ...
}


private IRouter BuildRouter(IApplicationBuilder app)
{
   var builder = new RouteBuilder(app);

   // Mapping del path db/sql per dirgli di usare il middleware del db
   builder.MapMiddlewareRoute("db/sql", appBuilder => 
   {
      appBuilder.UseDbMiddleware();
   }

   // Maping del path db/oracle per dirgli di usare il middleware del db
   builder.MapMiddlewareRoute("db/oracle", appBuilder =>
   {
      appBuilder.UseDbMiddleware();
   }
}




A questo punto ci sono due route che usano lo stesso middleware di gestione del db:
- db/sql
- db/oracle

Tutte le altre route non hanno il middleware configurato.

Quello che vorrei ottenere è che:
- La route db/sql passi al DbMiddleware l'istanza di SqlDatabase
- La route db/oracle passi al DbMiddleware l'istanza di OracleDatabase


Grazie mille

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.