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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With