Soy nuevo en ASP .net core. Me da un error de inyección de dependencia como:
InvalidOperationException: no se puede resolver el servicio para el tipo 'Spinit.Data.Services.Repository.GameRepository' al intentar activar 'SpinIt.Web.Controllers.CartController'. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
StackTrace está abajo:
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)
Código de control del carro
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);
}
}
También agregué servicio a Startup.cs
services.AddScoped<IGame, GameRepository>();
services.AddScoped<ICartItem, CartItemRepository>();
Usted registró IGame
como Tipo de servicio y GameRepository
como tipo de implementación con el contenedor del servicio .NET Core en el archivo Startup.cs. Entonces, aparentemente IGame
está registrado en el contenedor de servicio y solo el tipo IGame
puede inyectarse a través de DI. El sistema DI no conoce el servicio llamado GameRepository
ya que no está registrado con el contenedor de servicio DI.
Realice cambios en el constructor del controlador de esta manera:
private readonly IGame _gameRepository;
private readonly ICartItem _cartRepository;
public CartController(IGame gameRepository, ICartItem cartRepository)
{
_gameRepository = gameRepository;
_cartRepository = cartRepository;
}