J'essaie de créer une base réutilisable pour les futures applications web faites avec asp net core. J'ai créé une bibliothèque qui contient un BaseDbContext qui hérite d'IdentityDbContext:
public class BaseDbContext : IdentityDbContext<ApplicationUser>
{
public BaseDbContext(DbContextOptions options) : base(options)
{
}
}
À l'intérieur de cette bibliothèque, il existe des services de connexion et de création d'utilisateurs.
Chaque fois que je créerai une nouvelle application Web, je ferai référence à la bibliothèque et je créerai un nouveau DbContext comme ceci:
public class ProjectDbContext : BaseDbContext
{
//some generics DBSET
public ProjectDbContext (DbContextOptions<ProjectDbContext> options) : base(options)
{
}
}
Et au démarrage:
services.AddDbContext<ProjectDbContext>(options =>
{
options.UseSqlServer(connection);
});
Étant donné que le service de connexion et de création d'utilisateurs nécessite une référence de BaseDbContext, j'ai créé un IDbContextFactory
dans le projet de base qui sera implémenté par le projet principal comme ceci:
public class ProjectContextFactory : IDbContextFactory
{
private readonly ProjectDbContext _projectDbContext;
public ProjectDbContextFactory(ProjectDbContext remDbContext)
{
_remDbContext = remDbContext;
}
public BaseDbContext GetBaseDbContext()
{
return _projectDbContext;
}
}
Cette fabrique sera utilisée à l'intérieur du projet de base pour obtenir une référence au BaseDbContext.
Est-ce une bonne chose à faire? Cela peut-il créer des problèmes?
En général, non, ce n'est pas une bonne chose à faire.
qui contiendra les entités qui seront utilisées pour toutes les applications web
S'il existe des entités communes à tous les projets, celles-ci doivent être complètement prises en compte. En d'autres termes, vous auriez un projet (votre projet de base) avec un contexte comme UserContext
, qui aura vos entités User
et Credential
, puis chaque autre projet aurait son propre contexte distinct qui traite exactement de ce dont il a besoin. Si les autres applications ont besoin d'accéder aux utilisateurs, elles le feront via une instance de UserContext
ou, mieux, via un service, tel qu'une API.
Cela dit, il semble que vous ayez votre propre autorisation, ce que vous ne devriez absolument pas faire. Utilisez l'identité. Et, si vous devez partager cela entre des applications, vous avez besoin d'un fournisseur d'authentification centralisé, tel que Identity Server.