Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

System.AggregateException: 'Some services are not able to be constructed' In my ASP.net core

I have a model:

public class Checkout
{
    public string CheckoutId { get; set; }

    public List<CheckoutItem> CheckoutItems { get; set; }

}

And I am trying to add methods to the Object while respecting POCOs. So I added A repository:

    public class CheckoutRepository : ICheckoutRepository
    {
        private readonly AppDbContext _appDbContext;
        private readonly Checkout _checkout;

        public CheckoutRepository(AppDbContext appDbContext, Checkout checkout)
        {
            _appDbContext = appDbContext;
            _checkout = checkout;

        }

        public void AddItem(unitItem item, int amount)
        {
              //Removed for brevity 
        }

        public void ClearCheckout()
        {
           //Details removed for brevity
        }

        public Checkout GetCart(IServiceProvider serviceProvider)
        {   
          //Details removed for brevity
        }

        public List<CheckoutItem> GetCheckoutItems()
        {
            //Details removed for brevity
        }

        public decimal GetCheckoutTotal()
        {
           //Details removed for brevity
        }

        public decimal RemoveItem(unitItem item)
        {
           //Details removed for brevity
        }

And an interface to the Repository

public interface ICheckoutRepository
    {
         Checkout GetCart(IServiceProvider serviceProvider);

        void AddItem(unitItem item, int amount);

        decimal RemoveItem(unitItem item);

        List<CheckoutItem> GetCheckoutItems();

        void ClearCheckout();

        decimal GetCheckoutTotal();
    }

I, of course, add this to the startup file.

services.AddTransient<ICheckoutRepository, CheckoutRepository>();

But when I run the application I get the error

System.AggregateException: 'Some services are not able to be constructed'

And 2 inner exceptions

1:

InvalidOperationException: Error while validating the service descriptor 'ServiceType: BataCMS.Data.Interfaces.ICheckoutRepository Lifetime: Transient ImplementationType: BataCMS.Data.Repositories.CheckoutRepository': Unable to resolve service for type 'BataCMS.Data.Models.Checkout' while attempting to activate 'BataCMS.Data.Repositories.CheckoutRepository'.

And 2:

InvalidOperationException: Unable to resolve service for type 'BataCMS.Data.Models.Checkout' while attempting to activate 'BataCMS.Data.Repositories.CheckoutRepository'

Could really use some insight into this problem.

like image 899
Paul Gudu Avatar asked Jul 29 '20 14:07

Paul Gudu


1 Answers

When you look at your CheckoutRepository constructor, you'll see that you're injecting an instance of a Checkout class. ASP.NET doesn't know where to search for an instance of that class to inject, so you have to register it in your DI container.

Add this to your Startup file:

services.AddTransient<Checkout>(new Checkout());

This is a little bit different type of registering. Instead of depending on abstraction, you're depending on a concrete implementation of Checkout class. I've passed a default, parameterless constructor to the above example, but you can pass any other constructor to it, or (to depend on an abstraction) just create the ICheckout interface and register just like you registered the ICheckoutRepository:

services.AddTransient<ICheckout, Checkout>();

More on DI can be found here

I also explore the practical approach to it in this video

like image 196
Duck Ling Avatar answered Oct 11 '22 09:10

Duck Ling