0
votes

Injection de dépendance avec configuration dans .NET CORE

J'essaie d'injecter une dépendance en obtenant la configuration en classe dans le projet de base .NET. La classe où j'essaie d'injecter une dépendance est dans un autre projet. Mais d'une manière ou d'une autre, je ne suis pas capable d'obtenir les valeurs du fichier de configuration dans une dépendance injectée. Vous trouverez ci-dessous mon code

dans ci-dessous DBContext, je dois obtenir de la valeur à partir de la configuration, où j'ai utilisé une classe DI de dbconfiguration. P> xxx pré>

et mon fichier startup.cs dans web API P>

{
  "DBConfiguration": {


         "ConnectionString": "Server=myserver;Database=BaseProjectDB;Trusted_Connection=True;MultipleActiveResultSets=true",
         "ApplicationName": "WebAPI"


  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}


0 commentaires

3 Réponses :


2
votes

Vous semblez utiliser dbconfigurationOptions dans votre fichier de démarrage, tandis que vous injecte dbconfiguration dans votre dbcontext.

Voici comment j'utilise actuellement ma configuration: p>

public class DBContext : DbContext
{
    private readonly DBConfigurationOptions _dBConfiguration;

    public DBContext(IOptions<DBConfigurationOptions> dBConfiguration)
    {
        _dBConfiguration = dBConfiguration.Value;
    }
}


2 commentaires

Oui.


Je ne suis pas tout à fait certain (cela fait longtemps que j'ai mis en place quelque chose comme ça et je n'ai pas utilisé de cadre d'entité dans Forever), mais vous devriez peut-être déplacer la configuration dans votre démarrage au-dessus de l'addition de SQL Server. De plus, je vais modifier ma réponse avec un exemple de la manière dont nous utilisons la configuration, comme cela pourrait être utile.



0
votes

Pour recevoir la configuration, vous devez modifier la signature de votre constructeur dans dbcontext à partir de xxx

à xxx

Pour recevoir correctement l'option (N'oubliez pas d'ajouter l'espace de noms Microsoft.extensions.options ).

En outre, vous devez définir la classe dbconfiguration quelque part avec les propriétés que vous avez dans votre fichier de configuration.


2 commentaires

Mais nous ne pouvons pas l'utiliser sans interface IOPTIONS?


Je ne le pense pas. Si vous ajoutez les options à la collection de services via services.configure vous les recevez via ioptions interface. C'est la façon dont il est conçu.



1
votes

Pourquoi ne configurez-vous pas le DB directement dans l'endroit où vous avez également la configuration?
Dans votre classe DBContext (BTW, vous devriez probablement choisir un meilleur nom pour cela) Il vous suffit de révéler un constructeur comme celui-ci, pas besoin de remplacer la configuration ou quoi que ce soit comme ça.

Cette classe peut être dans n'importe quel assemblage que vous souhaitez. p> xxx pré>

Pour la configuration, vous pouvez simplement utiliser OptionsBuilder-Action intégrée (Place à l'intérieur du ConfigureServices Méthode): P>

var DBConfig = Configuration.GetSection("DBConfiguration").Get<DBConfiguration>();
services.AddSingleton(DBConfig);// <- now you can inject that if you want but it's not necessary

// now we don't need to get the config here
services.AddEntityFrameworkSqlServer()
    .AddDbContext<DBContext>(optionsBuilder =>
        optionsBuilder.UseSqlServer(DBConfig.ConnectionString)
    );


1 commentaires

Merci pour l'aide ! La raison pour laquelle je vais comme ça, j'essaye de faire du dal qui aura des fonctionnalités communes réalisables déjà disponibles afin que je puisse utiliser le même dal dans le nouveau projet que