2017-01-16 63 views
1

我正在一个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(); 
} 

回答

1

根据示例中的ConfigureServicesGetTestByIdQueryHandler was not registered。接口IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>已注册,遇到时会解析为GetTestByIdQueryHandler。有一个区别,很容易被误解。

当要求直接解决GetTestByIdQueryHandler时,DI容器不知道该怎么做。

所以要

services.AddScoped<GetTestByIdQueryHandler, GetTestByIdQueryHandler>(); 

要么升级服务,使其知道如何处理GetTestByIdQueryHandler

OR

更新的动作来调用的DI容器是知道的类型。

// GET api/values/5 
[HttpGet] 
[Route("getTest")] 
public GetTestByIdQueryResult GetTest([FromServices]IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult> handler,GetTestByIdQuery query) 
{ 
    return handler.Retrieve(query); 
} 

理想情况下,接口应遵循一些约定。

public interface IGetTestByIdQueryHandler : IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult> { 

} 

public class GetTestByIdQueryHandler : IGetTestByIdQueryHandler { 
    //... 
} 

据此登记

services.AddScoped<IGetTestByIdQueryHandler, GetTestByIdQueryHandler>(); 

而且完全溶解

// GET api/test/getTest 
[HttpGet] 
[Route("getTest")] 
public GetTestByIdQueryResult GetTest([FromServices]IGetTestByIdQueryHandler handler, GetTestByIdQuery query) { 
    return handler.Retrieve(query); 
} 
+0

恩科西嗨。感谢你的回答!添加这个 - >服务。AddScoped (); < - 做了诀窍。 –

相关问题