2017-01-16 4 views
1

私はasp.net MVC6プロジェクトに取り組んでいます。私は自分のWeb APIにいくつかの問題を抱えています。私が特定のApiをテストすると、私は内部エラー(500 http応答コード)を取得します。 web api asp.net mvc6アプリで例外が発生しました。

は私が調査し、私は私がサービスから取得しようとしていたオブジェクトを登録していないことを言って、このエラー、見つから:タイプ ' DotnetProject.BusinessLayer.Implementation.QuerryHandlersため

ないサービスを。 GetTestByIdQueryHandler ' が登録されています。

問題は私のコントローラは[FromServices]構文でIoCコンテナから特定のオブジェクトを要求し、私は私がやったとしても厳しいそのサービスを登録しなかった例外を取得することです。

サービスからそのオブジェクトを要求しない場合、私はもはや内部エラーは発生しません。

[FromServices]構文を持つオブジェクトを要求するすべてのAPI関数でこのエラーが発生します。だから問題はどこかにあるが、私はそれを理解できない。ここで

は私のコントローラクラスである:ここで

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

例のConfigureServicesに基づいて、GetTestByIdQueryHandler was not registered。インタフェースIQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>が登録されました。遭遇するとGetTestByIdQueryHandlerに解決されます。違いがあり、それは簡単に誤解されます。

DIコンテナは、GetTestByIdQueryHandlerを直接解決するかどうかを尋ねられたときに対処しません。

だから、どちらかの更新サービス

services.AddScoped<GetTestByIdQueryHandler, GetTestByIdQueryHandler>(); 

には、更新アクションはDIコンテナが認識しているというタイプを呼び出すためにGetTestByIdQueryHandler

OR

を処理する方法を知っているように。

// 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

こんにちはNkosi解決します。答えをありがとう!これを追加する - >サービス。AddScoped (); < - トリックを実行しました。 –

関連する問題