c# - InvalidOperationException:尝试激活时无法解析服务类型
问题描述
我正在使用 DI 和存储库模式创建 ASP.NET CORE 项目。当我运行项目时,我得到了这种类型的错误
InvalidOperationException:尝试激活“AD.Web.Controllers.KorisnikController”时无法解析“AD.BLL.Servisi.IKorisnikServis”类型的服务。
这是我的接口类
using System;
using System.Collections.Generic;
using System.Text;
namespace AD.BLL.Interfejsi
{
public interface IKorisnik
{
public string VratiKorisnike();
}
}
这是我的服务类,它调用这个接口
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>();
}
我检查了所有内容,但看不到哪里出错了。有什么帮助吗?
解决方案
在Controller
你需要创建类型的字段IKorisnik
是你的interface
而不是IKorisnikServis
,所以你的构造函数应该是这样的:
private IKorisnik _korisnikServis;
public KorisnikController(IKorisnik korisnikServis)
{
_korisnikServis = korisnikServis;
}
但是,我强烈建议您为您的IKorisnikServis
类考虑另一个名称(KorisnikServis
例如),因为前缀I
主要用于指示接口,在这种情况下它也具有误导性,我相信这就是您在控制器中使用它的原因错误。
推荐阅读
- spring - REST 的 NTLM 身份验证使用 Springboot 获取请求(401 未经授权)
- apache - 子域重定向到文件夹名称为 .htaccess 的子目录
- ruby-on-rails - Rails 6:响应负载返回 CSV 但未下载
- json - groovy json builder json.call - 组合单个 Json 输出
- google-apps-script - 可以从 Google Drive 而不是 script.google.com 运行 Apps 脚本吗?
- xcode - iOS 15 不受信任的开发者问题
- subroutine - Abaqus UMAT 子程序 - 执行后出错(警告 LNK4210?)
- c# - SoapException:未找到服务
- interface - 使 msg.sender 可用于外部合同
- oracle - oracle中执行当前查询和执行当前脚本的区别