System.AggregateException: '一些服务无法构建' 在我的ASP.net core中。

23

我有一个模型:

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

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

}

我正在尝试在尊重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
        }

并提供一个与仓库交互的接口

public interface ICheckoutRepository
    {
         Checkout GetCart(IServiceProvider serviceProvider);

        void AddItem(unitItem item, int amount);

        decimal RemoveItem(unitItem item);

        List<CheckoutItem> GetCheckoutItems();

        void ClearCheckout();

        decimal GetCheckoutTotal();
    }

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

services.AddTransient<ICheckoutRepository, CheckoutRepository>();

但是,当我运行应用程序时,我得到了错误:

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

还有2个内部异常:

1:

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

2:

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

真的需要一些关于这个问题的见解。


4
你在构造函数中传递了 Checkout checkout 参数,因此你需要将其从构造函数中删除或者在 DI 容器中进行注册。 - Guru Stron
请检查此文章,我遇到了以下问题:https://stackoverflow.com/questions/74051242/dbinizializer-register-in-program-in-net6-core-6-0-9 - Muhammad Asad
3个回答

26

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

将以下内容添加到启动文件中:

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

这是一种略有不同的注册方式。与依赖抽象不同,您要依赖于Checkout类的具体实现。我已经向上面的示例传递了一个默认的无参数构造函数,但您可以传递任何其他构造函数,或者(为了依赖于抽象)只需创建ICheckout接口并像注册ICheckoutRepository时一样进行注册:

services.AddTransient<ICheckout, Checkout>();

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

我还在这个视频中探讨了实际应用方法。


非常感谢您提供的解决方案和解释,只是想澄清一下关于 DI 的问题,注入具体类是否是不好的实践。我是否需要使用 ICheckout 接口进行某种程度的抽象化。但除此之外,该解决方案运行良好。再次感谢。 - Paul Gudu
2
嘿,保罗。没问题。这样想:有一天,你决定添加另一种结账方式,但是你的 ICheckoutRepository 只接受一种类型的结账(具体的 Checkout 类),而任何类型的 ICheckoutRepository 的内部工作(因为它是一个接口,所以可能有很多)都依赖于该类,因此添加另一个可能会变得痛苦。如果引入 ICheckout 接口,您将能够使用 ICheckout 的任何实现构建该存储库。在测试时进行模拟也很方便。请阅读依赖反转原则 :) - Duck Ling

2
也许你错过了?
services.AddTransient<ICheckout, Checkout>();

希望我有所帮助。

1
这是因为我在 IRepo 中声明为 IEnumerable,并从 repo 传递了一个列表。
修复后,我的问题得到了解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接