我正在一个asp.net MVC6项目,我在我的web api上有一些麻烦。当我测试某个Api时,我得到内部错误(500 http响应代码)。在web api上的异常asp.net mvc6应用程序,我没有注册服务
我调查,我发现这个错误,它说,我还没有注册我试图从服务来获取对象:
类型 ' DotnetProject.BusinessLayer.Implementation.QuerryHandlers没有服务。 GetTestByIQueryQueryHandler ' 已被注册。
的问题是,我的控制器请求从IoC容器中的某个对象与[FromServices]
语法和我得到一些未注册该服务甚至强硬。我做了一个例外。
如果我不从服务请求这个对象,我不会再有内部错误了。
我得到该错误的所有API函数,请求与[FromServices]
语法的对象。所以问题在那里,但我无法弄清楚。
这里是我的控制器类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DotnetProject.BusinessLayer.Interfaces;
using DotnetProject.DataLayer.Domain_Entities;
using DotnetProject.DataLayer.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using DotnetProject.BusinessLayer.Implementation.Queries.Users;
using DotnetProject.BusinessLayer.Implementation.QuerryHandlers.Users;
using DotnetProject.BusinessLayer.Implementation.QuerryResults.Users;
using DotnetProject.BusinessLayer.Implementation.Queries;
using DotnetProject.BusinessLayer.Implementation.QuerryHandlers;
using DotnetProject.BusinessLayer.Implementation.Commands.Users;
using DotnetProject.BusinessLayer.Implementation.CommandHandlers.Users;
using DotnetProject.BusinessLayer.Implementation.Commands;
using DotnetProject.BusinessLayer.Implementation.CommandHandlers;
// For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
namespace DotnetProject.Controllers.Api
{
[Route("api/[controller]")]
[AllowAnonymous]
public class TestController : Controller
{
private ITestRepository testRepository;
private ITestService testService;
public TestController(ITestRepository _testRepository,ITestService _testService)
{
testRepository = _testRepository;
testService = _testService;
}
// GET: api/values
[HttpGet]
[Route("getAllTests")]
public GetAllTestsQueryResult GetAll([FromServices] GetAllTestsQueryHandler handler)
{
return handler.Retrieve(new GetAllTestsQuery());
}
// GET api/values/5
[HttpGet]
[Route("getTest")]
public GetTestByIdQueryResult GetTest([FromServices]GetTestByIdQueryHandler handler,GetTestByIdQuery query)
{
return handler.Retrieve(query);
}
// DELETE api/values/5
[HttpPost]
[Route("delete")]
public void Delete(DeleteTestCommand command,[FromServices]DeleteTestHandler handler)
{
handler.Execute(command);
}
[HttpPost]
[Route("add")]
public void AddTest(AddTestCommand command, [FromServices]AddTestHandler handler) {
handler.Execute(command);
}
[HttpPost]
[Route("update")]
public void UpdateTest(UpdateTestCommand command,[FromServices]UpdateTestHandler handler) {
handler.Execute(command);
}
}
}
这里是被发现为“未注册”一个对象实例:
using AT.Core.Cqrs;
using DotnetProject.BusinessLayer.Implementation.Commands.Users;
using DotnetProject.DataLayer;
using DotnetProject.DataLayer.Domain_Entities;
using DotnetProject.DataLayer.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace DotnetProject.BusinessLayer.Implementation.CommandHandlers.Users
{
public class AddTestHandler : ICommandHandler<AddTestCommand>
{
private ITestRepository _testRepository;
public AddTestHandler(ITestRepository testRepository)
{
_testRepository = testRepository;
}
public void Execute(AddTestCommand newTest)
{
Test test = new Test();
test.Id = newTest.Id;
test.QuestionList = newTest.QuestionList;
test.TestDuration = newTest.TestDuration;
_testRepository.Add(test);
}
}
}
这里是启动文件我ConfigureServices功能:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddScoped<IUserService, UserService>();
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<ITestRepository, TestRepository>();
services.AddScoped<ITestService, TestService>();
services.AddScoped<IRoleService, RoleService>();
services.AddScoped<IRoleRepository, RoleRepository>();
services.AddScoped<ICommandHandler<DeleteUserCommand>, DeleteUserHandler>();
services.AddScoped<ICommandHandler<UpdateUserCommand>,UpdateUserHandler>();
services.AddScoped<ICommandHandler<AddUserCommand>, AddUserHandler>();
services.AddScoped<ICommandHandler<DeleteTestCommand>, DeleteTestHandler>();
services.AddScoped<ICommandHandler<UpdateTestCommand>, UpdateTestHandler>();
services.AddScoped<ICommandHandler<AddTestCommand>, AddTestHandler>();
services.AddScoped<IQueryHandler<GetAllTestsQuery,GetAllTestsQueryResult>,GetAllTestsQueryHandler>();
services.AddScoped<IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>,GetTestByIdQueryHandler>();
services.AddScoped<IQueryHandler<GetAllUsersQuery, GetAllUsersQueryResult>, GetAllUsersQueryHandler>();
services.AddScoped<IQueryHandler<GetUserByIdQuery, GetUserByIdQueryResult>, GetUserByIdQueryHandler>();
services.AddDbContext<ApplicationContext>();
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.OutputFormatters.Clear();
config.OutputFormatters.Add(new JsonOutputFormatter(new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}, ArrayPool<char>.Shared));
});
services.AddMvc();
// Inject an implementation of ISwaggerProvider with defaulted settings applied
services.AddSwaggerGen();
}
恩科西嗨。感谢你的回答!添加这个 - >服务。AddScoped(); < - 做了诀窍。 –