L'injection de DbContext dans la couche de service
Comment suis-je censé injecter mon MyDbContext
dans ma base de données de la couche de service MyService
?
De démarrage.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddMvc();
}
MyDbContext.cs
public partial class MyDbContext : DbContext
{
public virtual DbSet<User> User { get; set; }
public MyDbContext(DbContextOptions<MyDbContext> options)
:base(options)
{
}
}
appsettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=MyServer;Database=MyDatabase;user id=MyUser;password=MyPassword;"
}
}
MyService.cs
public class MyService
{
public User GetUser(string username)
{
//Should i remove this call and get the reference from the injection somehow?
MyDbContext db_context = new MyDbContext(optionsBuilder.Options);
using (db_context)
{
var users = from u in db_context.User where u.WindowsLogin == username select u;
if (users.Count() == 1)
{
return users.First();
}
return null;
}
}
}
Dans mon GetUser
méthode, je sais que je suis censé être à l'aide de mon injecté MyDbContext
ici, mais je ne suis pas tout à fait sûr de savoir comment le récupérer. Quelle pièce du puzzle qui me manque?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas à inclure le dbcontext vous-même, ASP.NET de base de l'injection de dépendances de service fera cela pour vous.
Vous suffit de déclarer vos services et de votre contexte de base de données dans votre démarrage de classe, et de mettre le dbcontext vous avez besoin dans votre service constructeur :
De démarrage.cs (votre devez choisir le service de la vie que vous voulez, ici, c'est une étendue de service, une fois par demande):
Votre classe de service:
Dans votre contrôleur, vous devez déclarer les services (ou le contexte de base de données), vous devez utiliser de la même façon :
Remarque sur le contrôleur : vous n'avez pas à les ajouter dans votre démarrage de classe comme vous le faites avec votre base de données de contexte ou de vos services. Mettre en œuvre leur constructeur.
Si vous avez besoin de plus d'informations sur le .NET de Base des dépendances de l'injection, la documentation officielle est clair et très complet : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
NB:
Dans le démarrage.cs, le AddScoped ligne est une option. Vous pouvez choisir la vie que vous voulez pour votre service.
Il est des durées différentes, vous pouvez choisir :
Ci-dessus prise à partir de: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
Remarque: Il n'est pas la question ici, mais votre GetUser données de requête ressemble un peu étrange pour moi. Si votre count()==1, l'objectif est de vérifier l'unicité de l'utilisateur, de la bonne façon est d'ajouter une contrainte d'unicité dans votre base de données. Si count()==1, l'objectif est de vérifier que vous avez données pour éviter un objet de référence nulle exception, vous pouvez utiliser .FirstOrDefault(), il sera gérer pour vous. Vous pouvez simplifier cette méthode :
MyService service = new MyService();
de mon contrôleur, mais il est exigeant MyDbContext comme le constructeur.ObjectDisposedException: Cannot access a disposed object
MyService
et oui, je suis en utilisantusing(_context)
. L'erreur se produit quand je l'appelleusers.ToList();