Sto cercando di creare una base riutilizzabile per le future applicazioni Web realizzate con asp net core. Ho creato una libreria che contiene un BaseDbContext che eredita da IdentityDbContext:
public class BaseDbContext : IdentityDbContext<ApplicationUser>
{
public BaseDbContext(DbContextOptions options) : base(options)
{
}
}
All'interno di questa libreria ci sono alcuni servizi per l'accesso e la creazione di Utenti.
Ogni volta che creerò una nuova WebApplication farò riferimento alla libreria e creerò un nuovo DbContext come questo:
public class ProjectDbContext : BaseDbContext
{
//some generics DBSET
public ProjectDbContext (DbContextOptions<ProjectDbContext> options) : base(options)
{
}
}
E all'avvio:
services.AddDbContext<ProjectDbContext>(options =>
{
options.UseSqlServer(connection);
});
Poiché il servizio per l'accesso e la creazione di utenti richiede un riferimento a BaseDbContext, ho creato una IDbContextFactory
all'interno del progetto di base che verrà implementata dal progetto principale in questo modo:
public class ProjectContextFactory : IDbContextFactory
{
private readonly ProjectDbContext _projectDbContext;
public ProjectDbContextFactory(ProjectDbContext remDbContext)
{
_remDbContext = remDbContext;
}
public BaseDbContext GetBaseDbContext()
{
return _projectDbContext;
}
}
Questa fabbrica verrà utilizzata all'interno del progetto di base per ottenere un riferimento a BaseDbContext.
È una buona cosa da fare? Questo può creare qualche tipo di problema?
In generale, no, questa non è una buona cosa da fare.
che conterrà le entità che verranno utilizzate per tutte le applicazioni web
Se ci sono entità comuni a tutti i progetti, questi dovrebbero essere presi in considerazione completamente. In altre parole, avresti un progetto (il tuo progetto di base) con un contesto come UserContext
, che avrà le tue entità User
e Credential
, e quindi ogni altro progetto avrebbe il suo contesto separato che si occupa proprio di ciò di cui ha bisogno. Se le altre applicazioni devono accedere agli utenti, lo farebbero tramite un'istanza di UserContext
o, meglio, attraverso un servizio, come un'API.
Detto questo, sembra che si sta rotolando la propria autenticazione, che si dovrebbe decisamente non fare. Usa identità. E, se è necessario condividerlo tra le applicazioni, è necessario un provider di autorizzazione centralizzato, come Identity Server.