ASP.NET5 500使用存储库模式时出错
本文关键字:模式 出错 存储 NET5 ASP | 更新日期: 2023-09-27 18:28:45
编辑3:我不知道我做了什么来解决这个问题,但我的问题消失了。我认为我发现的最重要的事情,如果你有这个问题的话,需要注意的是,在ASP.NET 5 MVC 6中,我们必须为几乎所有的东西添加中间件,包括使用app.UseDeveloperExceptionPage();
的开发人员错误页面。。。在那之后,我意识到堆栈跟踪可能引用了从控制器中引用的其他类,比如在我的情况下的存储库和上下文对象。我有点搞砸了,但我不记得有什么大的改变。我想我的存储库类的构造函数可能有一个拼写错误。
控制器出现500内部服务器错误,但它显示的静态json数据没有构造函数。我怀疑内置的依赖项注入有问题,但我无法解决,因为我在构建过程中没有收到任何错误或警告。
编辑:当导航到http://localhost:5000/api/blogpost/
时,我在浏览器中完全看不到任何东西。只是一页空白。没有错误。没有什么。使用Postman发送HTTP请求,我得到错误代码500。同样,通过注释掉构造函数,我看到了{"name":"Cameron"}
,并在浏览器和Postman中获得了代码200OK。VS中没有异常,输出控制台中也没有错误。
编辑2:我找到了中间件app.UseDeveloperExceptionPage();
,它产生了MissingMethodException: No parameterless constructor defined for this object.
-如果我制作了一个无参数构造函数,它就会产生:InvalidOperationException: Multiple constructors accepting all given argument types have been found in type 'MyApp.Controllers.BlogPostController'. There should only be one applicable constructor.
-看起来ASP.NET5的dep注入有点奇怪?
这是我的控制器:
using MyApp.Data.Repository;
using MyApp.Models;
using Microsoft.AspNet.Mvc;
using System;
namespace MyApp.Controllers
{
[Route("api/[controller]")]
public class BlogPostController : Controller
{
// If I comment out this var and the constructor this works.
private IBlogPostRepository _repository;
// If I leave them here, I get a 500 Internal Server Error.
// If I set a breakpoint here, it never fires.
// If I create a constructor that takes zero args, it never fires.
// I do not get any errors.
public BlogPostController(IBlogPostRepository repository)
{
_repository = repository;
}
[HttpGet]
public JsonResult Get()
{
return Json(new { name = "Cameron" });
}
}
}
这里是Startup.cs配置服务:
public void ConfigureServices(IServiceCollection services)
{
// MVC 6
services.AddMvc();
// EntityFramework 7
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<AppDbContext>(options =>
{
// Will use the last Data:DefaultConnection:ConnectionString
// that was loaded from the config files in the constructor.
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
});
// Injections
services.AddTransient<AppDbContextSeedData>();
services.AddScoped<IBlogPostRepository, BlogPostRepository>();
}
我也遇到了同样的问题。我的构造函数没有作用域。这个类是公共的,所以我在构造函数之前添加了"public",它就起作用了!
所以,不起作用:
public class VisualizationsController : Controller
{
VisualizationsController() {...}
}
工作:
public class VisualizationsController : Controller
{
public VisualizationsController() {...}
}
我在添加另一个控制器时遇到了一种情况,忘记更新Startup.cs页面。
在Startup.cs的ConfigureServices下,尝试添加:
services.AddSingleton<ISomeRepository, SomeRepository>();
services.AddSingleton<ISomeOtherRepository, SomeOtherRepository>();
假设您在新的控制器构造函数中传递ISomeOtherDepository