Je suis nouveau sur le noyau ASP .net. Cela me donne une erreur d'injection de dépendance comme:
InvalidOperationException: impossible de résoudre le service pour le type «Spinit.Data.Services.Repository.GameRepository» lors de la tentative d'activation de «SpinIt.Web.Controllers.CartController». Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
StackTrace est ci-dessous:
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)
Code 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);
}
}
J'ai également ajouté un service à Startup.cs
services.AddScoped<IGame, GameRepository>();
services.AddScoped<ICartItem, CartItemRepository>();
Vous avez enregistré IGame
tant que type de service et GameRepository
tant que type d'implémentation avec le conteneur de services .NET Core dans le fichier Startup.cs. Donc apparemment IGame
est enregistré dans le conteneur de service et seul le type IGame
peut être injecté via DI. Le système DI ne connaît pas le service nommé GameRepository
car il n'est pas enregistré avec le conteneur de service DI.
Veuillez apporter des modifications au constructeur du contrôleur comme suit:
private readonly IGame _gameRepository;
private readonly ICartItem _cartRepository;
public CartController(IGame gameRepository, ICartItem cartRepository)
{
_gameRepository = gameRepository;
_cartRepository = cartRepository;
}