我创建了一个。NET核心MVC应用程序,并使用依赖项注入和存储库模式将存储库注入控制器。但是,我得到一个错误:
无法解析类型WebApplication ation1的服务。数据。BloggerRepository'同时尝试激活'WebApplication 1.控制器。BlogController'.
型号(Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
DbContext(BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
存储库(IBloggerRepository.cs
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void Save();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggerRepository : IBloggerRepository
{
private readonly BloggingContext _context;
public BloggerRepository(BloggingContext context)
{
_context = context;
}
public IEnumerable<Blog> GetBlogs()
{
return _context.Blogs.ToList();
}
public void InsertBlog(Blog blog)
{
_context.Blogs.Add(blog);
}
public void Save()
{
_context.SaveChanges();
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
启动。政务司司长(有关守则)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IBloggerRepository, BloggerRepository>();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
控制器(BlogController.cs)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Data;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class BlogController : Controller
{
private readonly IBloggerRepository _repository;
public BlogController(BloggerRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
return View(_repository.GetBlogs().ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_repository.InsertBlog(blog);
_repository.Save();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
我不确定我做错了什么。有什么想法吗?
在我的例子中,我试图为一个需要构造函数参数的对象进行依赖注入。在这种情况下,在启动期间,我只提供了配置文件中的参数,例如:
var config = Configuration.GetSection("subservice").Get<SubServiceConfig>();
services.AddScoped<ISubService>(provider => new SubService(config.value1, config.value2));
我遇到这个问题是因为在依赖项注入设置中,我缺少一个存储库的依赖项,该存储库是控制器的依赖项:
services.AddScoped<IDependencyOne, DependencyOne>(); <-- I was missing this line!
services.AddScoped<IDependencyTwoThatIsDependentOnDependencyOne, DependencyTwoThatIsDependentOnDependencyOne>();
要分解错误消息,请执行以下操作:
无法解析类型WebApplication 1的服务。数据。BloggerRepository'同时尝试激活'WebApplication 1.控制器。BlogController'.
也就是说,您的应用程序正在尝试创建BlogController
的实例,但它不知道如何创建BloggerRepository
的实例以传递到构造函数中。
现在看看你的创业公司:
services.AddScoped<IBloggerRepository, BloggerRepository>();
也就是说,每当需要IBloggerRepository
时,创建一个BloggerRepository
并将其传入。
但是,您的控制器类要求使用具体的类BloggerRepository
,而依赖项注入容器在直接要求时不知道该做什么。
我猜你刚刚打错了,但很常见。因此,简单的修复方法是更改您的控制器以接受DI容器确实知道如何处理的东西,在本例中,是接口:
public BlogController(IBloggerRepository repository)
// ^
// Add this!
{
_repository = repository;
}
请注意,有些对象有自己的自定义注册方式,这在使用外部Nuget包时更为常见,因此为它们阅读文档是值得的。例如,如果您收到一条消息说:
无法解析“Microsoft”类型的服务。AspNetCore。Http。IHttpContextAccessor'。。。
然后,您可以使用该库提供的自定义扩展方法来修复该问题,该方法将是:
services.AddHttpContextAccessor();
对于其他包-始终阅读文档。
我创建了一个.NETCoreMVC应用程序,并使用依赖注入和存储库模式将存储库注入我的控制器。然而,我得到一个错误: 无法解析类型WebApplication1.Data.BloggerRepository的服务,而试图激活WebApplication1.Controllers.BlogController。 存储 库: 控制器: 启动. cs: 我不知道我做错了什么。有什么想法吗?
我正在尝试创建ASP。NET核心应用程序使用通用存储库模式,使用实体框架和服务层。然而,每当我启动项目时,都会遇到以下错误: 无法解析“GameSource”类型的服务。数据存储库。GameRepository“正在尝试激活”GameSource。服务。游戏服务'。 游戏控制器。反恐精英: 游戏服务。反恐精英: 游戏存储库。反恐精英: BaseRepository。反恐精英: GameSource
在我的ASP. NET Core应用程序中,我收到以下错误: 无效操作异常:在尝试激活“城市”时无法解析类型“城市”的服务。模型。IRepository。控制器。HomeController。 我是家庭控制器,我试图将城市的getter传递给视图,如下所示: 我有一个文件存储库。cs包含一个接口及其实现,如下所示: 我的启动类包含从模板生成的默认代码。我做了任何更改:
我正在创建viewcomponents,下面是我的全部代码。。但当我调用这个viewcomponent时,我得到如下错误。。所以,任何人都可以帮助我解决这个问题,并向我解释到底是什么问题。 错误是: InvalidOperationException:无法解析“Perfulmestore”类型的服务。数据模型。ShoppingCart正在尝试激活香水商店。视图组件。ShoppingCartSumm
登录控制器中出现此错误。 无效操作异常:在尝试激活“汽车。服务器。控制器。AuthController”时,无法解析类型为“Microsoft. AspNetCore。身份。UserManager'1[汽车。模型。帐户]”的服务。 这是Auth Controller构造函数: 这里是启动中的ConfigureServices。反恐精英:
我使用泛型使代码可重用,并利用依赖项注入。 我有两个接口:DataParserImplementation和ObjectImplementation。我有实现每个的类:SalesRepbyId实现DataParserImpl(它将数据解析为对象并将这些对象放入集合)。SalesRep实现Objectimpl(它是特定数据集的对象)。 我试图得到它,这样我就可以选择在我的SalesRepbyId类中