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”类型的服务
真的可以对这个问题有所了解。
当您查看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)
我也在这个视频中探索了它的实用方法
| 归档时间: |
|
| 查看次数: |
12890 次 |
| 最近记录: |