web-dev-qa-db-fra.com

Impossible de résoudre le service pour le type lors de l'activation

J'ai un fichier Repository.cs qui contient une interface et son implémentation comme ceci:

public interface IRepository

{
    IEnumerable<City> Cities { get; }
    void AddCity(City newCity);
}

public class MemoryRepository : IRepository
{
    private List<City> cities = new List<City> {
        new City { Name = "London", Country = "UK", Population = 8539000},
        new City { Name = "New York", Country = "USA", Population = 8406000 },
        new City { Name = "San Jose", Country = "USA", Population = 998537 },
        new City { Name = "Paris", Country = "France", Population = 2244000 }
    };

    public IEnumerable<City> Cities => cities;

    public void AddCity(City newCity)
    {
        cities.Add(newCity);
    }
}

Et dans le HomeController j'essaie de passer le Cities getter à la vue comme ceci:

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController(IRepository repo)
        {
            repository = repo;
        }

        public IActionResult Index()
        {
            return View(repository.Cities);
        }

    }

Cependant, j'obtiens cette erreur:

InvalidOperationException: Impossible de résoudre le service pour le type 'Cities.Models.IRepository' en essayant d'activer "Cities.Controllers.HomeController".

6
Vojislav Kovacevic

Vous devez enregistrer IRepository dans le cadre d’injection de dépendance. Par exemple, dans ConfigureServices, vous pouvez ajouter:

services.AddScoped<IRepository, MemoryRepository>();

Voir ici pour plus d’informations sur l’injection de dépendances dans ASP.NET Core.

AddScoped n'est qu'un exemple, mais l'une des approches les plus courantes:

Les services à durée de vie limitée sont créés une fois par demande.

8
Kirk Larkin

Vous devez ajouter votre implémentation à la section DO (injection de dépendance). Pour .Net Core Mvc, ce serait comme ceci: 

 public void ConfigureServices(IServiceCollection services)
 {
   services.AddDbContext<ApplicationDbContext>(options =>
    options.UseInMemoryDatabase()
   );
   services.AddScoped<IRepository, MemoRepostory>();

 }
1
Ekrem

Cela peut ne pas être utile pour votre exemple de code, mais dans mon cas, la même erreur résultait d'une dépendance circulaire.

1
gneric

Une méthode comme celle-ci doit être ajoutée à votre Startup:

    // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    //...

    // Add application services.
    services.AddTransient<IRepository, MemoryRepository>();

    //..
}

Les services doivent être enregistrés avant d'être utilisés.

UPDATE: Si vous ne souhaitez pas utiliser DI pour votre application, créez simplement une instance de MemoryRepository sur le constructeur de HomeController, comme ceci:

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController()
        {
            repository = new MemoryRepository();
        }

        public IActionResult Index()
        {
            return View(repository.Cities);
        }

    }
0
Afshar Mohebbi

Les autres réponses sont CORRECT, mais j’étais en train de lancer un nouveau projet asp.net core 2.1.x et j’ai eu cette erreur.

A fini par être une faute de frappe par ME.

Donc, dans mon contrôleur au lieu d'utiliser correctement l'interface comme ceci

public HomeController(IApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

Ma typo me faisait utiliser ApplicationRepository au lieu de ApplicationRepository Remarque ci-dessous, et donc avec NO ERRORS, repérer le "I" manquant était amusant: /

public HomeController(ApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

Ainsi, le contrôleur ne résolvait pas la DI ...

0
Tom Stickel

Nous obtenons cette erreur dans la première approche de la base de données principale Entity Frame Work. J'ai suivi les étapes ci-dessous et l'erreur a été résolueenter code here

Étape 1: Vérifiez votre constructeur de classe de contexte devrait être comme ceci

public partial class ZPHSContext : DbContext
{
    public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions):base(dbContextOptions)`enter code here`
    {
    }
}

Étape 2: dans le fichier de démarrage

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddDbContext<ZPHSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

Étape 3: chaîne de connexion dans les paramètres d'applications

"ConnectionStrings": {
    "BloggingDatabase": "Server=Server=****;Database=ZPHSS;Trusted_Connection=True;"
}

Étape 4: Supprimer le code par défaut de la méthode OnConfiguring dans la classe de contexte

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
0
karunakar bhogyari