ASP .net 코어를 처음 사용합니다. 그것은 다음과 같이 종속성 주입 오류를 발생시킵니다.
InvalidOperationException : 'SpinIt.Web.Controllers.CartController'를 활성화하는 중 'Spinit.Data.Services.Repository.GameRepository'유형의 서비스를 분석 할 수 없습니다. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
StackTrace는 다음과 같습니다.
Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
lambda_method(Closure , IServiceProvider , object[] )
Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider+<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider+<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
CartController 코드
public class CartController:Controller
{
private readonly GameRepository _gameRepository;
private readonly Cart _cartRepository;
public CartController(GameRepository gameRepository, Cart cartRepository)
{
_gameRepository = gameRepository;
_cartRepository = cartRepository;
}
public ViewResult Index()
{
var items = _cartRepository.GetCartItems();
_cartRepository.CartItems = items;
var sCVM = new CartViewModel
{
Cart = _cartRepository,
CartTotal = _cartRepository.GetCartTotal()
};
return View(sCVM);
}
}
Startup.cs 에도 서비스를 추가했습니다
services.AddScoped<IGame, GameRepository>();
services.AddScoped<ICartItem, CartItemRepository>();
Startup.cs 파일의 .NET Core 서비스 컨테이너에 IGame
을 서비스 유형으로, GameRepository
를 구현 유형으로 등록했습니다. 따라서 IGame
은 서비스 컨테이너에 등록되어 있으며 DI를 통해 IGame
유형 만 주입 할 수 있습니다. DI 시스템은 GameRepository
라는 서비스를 DI 서비스 컨테이너에 등록하지 GameRepository
때문에 인식하지 못합니다.
컨트롤러 생성자를 다음과 같이 변경하십시오.
private readonly IGame _gameRepository;
private readonly ICartItem _cartRepository;
public CartController(IGame gameRepository, ICartItem cartRepository)
{
_gameRepository = gameRepository;
_cartRepository = cartRepository;
}