System.AggregateException:“无法构建某些服务”在我的 ASP.net 核心中

Pau*_*udu 5 c# asp.net-core-mvc asp.net-core

我有一个模型:

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

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

}
Run Code Online (Sandbox Code Playgroud)

我试图在尊重 POCO 的同时向对象添加方法。所以我添加了一个存储库:

    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
        }
Run Code Online (Sandbox Code Playgroud)

和存储库的接口

public interface ICheckoutRepository
    {
         Checkout GetCart(IServiceProvider serviceProvider);

        void AddItem(unitItem item, int amount);

        decimal RemoveItem(unitItem item);

        List<CheckoutItem> GetCheckoutItems();

        void ClearCheckout();

        decimal GetCheckoutTotal();
    }
Run Code Online (Sandbox Code Playgroud)

当然,我将其添加到启动文件中。

services.AddTransient<ICheckoutRepository, CheckoutRepository>();

但是当我运行应用程序时出现错误

System.AggregateException: '某些服务无法构建'

和 2 个内部异常

1:

InvalidOperationException: 验证服务描述符时出错:“ServiceType: BataCMS.Data.Interfaces.ICheckoutRepository Lifetime: Transient ImplementationType: BataCMS.Data.Repositories.CheckoutRepository”:尝试时无法解析“BataCMS.Data.Models.Checkout”类型的服务激活“BataCMS.Data.Repositories.CheckoutRepository”。

和 2:

InvalidOperationException:尝试激活“BataCMS.Data.Repositories.CheckoutRepository”时无法解析“BataCMS.Data.Models.Checkout”类型的服务

真的可以对这个问题有所了解。

Duc*_*ing 6

当您查看CheckoutRepository构造函数时,您会看到您正在注入一个Checkout类的实例。ASP.NET 不知道在哪里搜索要注入的类的实例,因此您必须在 DI 容器中注册它。

将此添加到您的启动文件中:

services.AddTransient<Checkout>(new Checkout());
Run Code Online (Sandbox Code Playgroud)

这是一种有点不同的注册类型。您不是依赖于抽象,而是依赖于Checkout类的具体实现。我已经向上面的示例传递了一个默认的无参数构造函数,但是您可以将任何其他构造函数传递给它,或者(依赖于抽象)只需创建ICheckout接口并注册,就像您注册的一样ICheckoutRepository

services.AddTransient<ICheckout, Checkout>();
Run Code Online (Sandbox Code Playgroud)

可以在此处找到有关 DI 的更多信息

我也在这个视频中探索了它的实用方法

  • 嘿保罗。没问题。这样想:有一天,您决定添加另一种结帐方法,但您的“ICheckoutRepository”仅接受一种类型的结帐(具体的“Checkout”类)以及任何类型“ICheckoutRepository”的内部工作方式(可以有因为它是一个接口,所以有很多)依赖于该类,因此添加另一个类可能会变得很痛苦。如果您引入“ICheckout”接口,您将能够使用“ICheckout”的任何实现来构造该存储库。在测试时进行模拟时它也很有用。阅读依赖倒置原则:) (2认同)