InvalidOperationException: невозможно разрешить службу для типа при попытке активации - PullRequest
1 голос
/ 22 апреля 2020

Я создаю ASP. NET CORE проект с использованием DI и Repository Pattern. Когда я запускаю проект, я получаю этот тип ошибки

InvalidOperationException: невозможно разрешить службу для типа 'AD.BLL.Servisi.IKorisnikServis' при попытке активировать AD.Web.Controllers.KorisnikController '.

Вот мой класс интерфейса

using System;
using System.Collections.Generic;
using System.Text;

namespace AD.BLL.Interfejsi
{
    public interface IKorisnik
    {
        public string VratiKorisnike();
    }
}

А вот мой класс Service, который вызывает этот интерфейс

using AD.BLL.Interfejsi;
using AD.Web.Data;
using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Text;

namespace AD.BLL.Servisi
{
    public class IKorisnikServis : IKorisnik
    {
        private  ApplicationDbContext _db;

        public IKorisnikServis(ApplicationDbContext db)
        {
            _db = db;
        }

        public string VratiKorisnike()
        {
            System.DirectoryServices.DirectoryEntry rootDSE = new System.DirectoryServices.DirectoryEntry("LDAP://RootDSE");
            var defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value;
            DirectorySearcher dssearch = new DirectorySearcher("LDAP://" + defaultNamingContext);
            dssearch.Filter = "(sAMAccountName=ABCDEFGHI)";
            SearchResult sresult = dssearch.FindOne();
            System.DirectoryServices.DirectoryEntry dsresult = sresult.GetDirectoryEntry();

            var Ime = dsresult.Properties["Ime"][0].ToString();
            var Prezime = dsresult.Properties["Prezime"][0].ToString();
            var LoginName = dsresult.Properties["LoginName"][0].ToString();
            var Status = dsresult.Properties["Status"][0].ToString();
            var AccountExpired = dsresult.Properties["AccountExpired"][0].ToString();
            var PassNevExp = dsresult.Properties["PassNevExp"][0].ToString();
            var DomenskaGrupa = dsresult.Properties["DomenskaGrupa"][0].ToString();
            var Email = dsresult.Properties["Email"][0].ToString();

            return Ime;
        }
    }
}

Вот мой ApplicationDbContext класс

using AD.Models.DbModels;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace AD.Web.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        public DbSet<Korisnik> Korisnici { get; set; }
    }
}

А вот мое действие контроллера

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AD.BLL.Servisi;
using Microsoft.AspNetCore.Mvc;

namespace AD.Web.Controllers
{
    public class KorisnikController : Controller
    {
        private  IKorisnikServis _korisnikServis;

        public KorisnikController(IKorisnikServis korisnikServis)
        {
            _korisnikServis = korisnikServis;
        }

        public IActionResult VratiKorisnike()
        {
            _korisnikServis.VratiKorisnike();
             return View();
        }
        public IActionResult Index()
        {
            return View();
        }
    }
}

И в Startup.cs я регистрирую IKorisnik и IKorisnikServic

public void ConfigureServices(IServiceCollection services)
{

    services.AddControllersWithViews();
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IKorisnik, IKorisnikServis>();

}

Я все проверил, но Я не вижу, где я сделал ошибку. Любая помощь ?

1 Ответ

1 голос
/ 22 апреля 2020

В вашем Controller вам нужно создать поле типа IKorisnik, которое будет вашим interface вместо IKorisnikServis, поэтому ваш конструктор должен выглядеть так:

private  IKorisnik _korisnikServis;

public KorisnikController(IKorisnik korisnikServis)
{
    _korisnikServis = korisnikServis;
}

Однако, Я бы настоятельно рекомендовал рассмотреть другое имя для вашего IKorisnikServis класса (например, KorisnikServis), так как префикс I в основном используется для обозначения интерфейса, в данном случае это также вводит в заблуждение, и я полагаю, что именно поэтому вы по ошибке использовал его в вашем контроллере.

...