1
votes

C # IOptions ne peut pas convertir implicitement mon objet vers l'interface pour l'injecter dans mes services AddSingleton

J'apprends à utiliser MongoDB avec C # ASP.NET et j'ai suivi ce guide de Microsoft sur l'utilisation de MongoDB Guide Mongo Doc . Je suis arrivé à l'étape 3 de la section Ajouter un modèle de configuration et j'essaie d'injecter mon interface de configuration dans le singleton de service afin qu'il résout l'instance de mon modèle de configuration comme le dit le guide. J'utilise exactement le même code que le guide avec mes objets, car il continue de lancer une erreur indiquant que ne peut pas convertir implicitement le type 'Models.UserDBSettings' en 'Models.IUserDBSettings'. Une conversion explicite existe (vous manquez une distribution?) . Alors je me demandais comment résoudre ce problème? merci pour votre aide à l'avance

Voici mon code:

Startup.cs

{
 "UserDBSettings": {
  "UserCollection": "Users",
  "ConnectionString": "mongodb://connectionAdresss",
  "DatabaseName": "DBName"
 },

UserDBSettings

    public class UserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}

public interface IUserDBSettings
{
  string UserCollectionName { get; set; }
  string ConnectionString { get; set; }
  string DataBaseName { get; set; }
}


1 commentaires

Ou ... Laissez tomber l'interface. Je ne comprends jamais les interfaces sur de vieux objets de données. Les interfaces indiquent un contrat, bien sûr, mais elles impliquent également qu'il pourrait exister une autre implémentation. Quelle autre implémentation possible d'un sac de propriétés allez-vous vraiment avoir?


3 Réponses :


2
votes

Vous devez marquer UserDBSettings comme implémentant l'interface IUserDBSettings (voir docs ) sinon ce ne sont que 2 types qui ont les mêmes propriétés:

public class UserDBSettings : IUserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}


0 commentaires

2
votes

Le conteneur DI exige que la classe de service que vous enregistrez implémente réellement l'interface.

public class UserDBSettings : IUserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}


1 commentaires

merci j'ai raté ça. Vous manquez toujours la plus petite chose et vous vous grattez la tête en essayant de résoudre le problème.



0
votes

Tout comme Chris l'a dit:

Le conteneur DI exige que la classe de service que vous enregistrez implémente réellement l'interface

La meilleure pratique consiste à travailler avec une interface. S'il y a une raison pour laquelle vous n'utilisez pas d'interface, vous pouvez essayer ceci:

public YourConstructor(IOptions<UserDBSettings> userDBSettings)
{
    _userDBSettings = userDBSettings.Value;
}

Dans votre classe, vous pouvez l'utiliser comme:

services.Configure<UserDBSettings>(
    options => Configuration.GetSection("UserDBSettings").Bind(options));


0 commentaires