【问题标题】:Some services are not able to be constructed (Error while validating the service descriptor) C#某些服务无法构造(验证服务描述符时出错)C#
【发布时间】:2021-07-09 05:57:40
【问题描述】:

我正在制作 asp .NET 核心 Web API,我制作了一些服务并注入了它,它工作正常。 我在同一个解决方案中创建了一个新的网络应用程序,我想使用相同的服务 我刚刚得到了

Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable serviceDescriptors, IServiceProviderEngine engine, ServiceProviderOptions options)

AggregateException:无法构造某些服务(验证服务描述符“ServiceType:E_CommerceApi.Services.IAttributeService Lifetime:Scoped ImplementationType:E_CommerceApi.Services.AttributeService”时出错:无法解析“E_CommerceApi.Authentication”类型的服务.ApplicationDbContext 尝试激活“E_CommerceApi.Services.AttributeService”。)

服务和 IService 代码

 public interface IAttributeService
 {
   Task<AllAttributes> GetAll();
 }


 public class AttributeService : IAttributeService
 {
   private readonly ApplicationDbContext _db;
   public AttributeService(ApplicationDbContext db)
   {
       _db = db;
   }
 }

在同一个项目中注入服务

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnStr")));
    // register services
    services.AddScoped<IAttributeService, AttributeService>();
}

在另一个不工作的 web 项目中注入服务

  public void ConfigureServices(IServiceCollection services)
  {
      services.AddControllersWithViews();
      services.AddScoped<IAttributeService, AttributeService>();
  }

【问题讨论】:

  • 第二个项目似乎缺少对AddDbContext&lt;ApplicationDbContext&gt;的调用。
  • 你的意思是在我想使用这个服务的每个项目中添加和安装实体框架?
  • 当您不注册它所依赖的ApplicationDbContext 时,您希望如何构造AttributeService
  • @esamaldinelzain:不是在每个项目中,但至少在每个Composition Root(即每个启动项目)中。

标签: c# asp.net-core dependency-injection .net-5


【解决方案1】:

由于您没有在第二个项目中注册 DBContext,

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnStr")));

解析 IAttributeService 的尝试失败,因为它的实现 (AttributeService) 期望它被注入到它的构造函数中。

但是,如果我了解您想要做什么,但我不确定我是否了解,您似乎希望能够访问您的第二个项目中的服务,而不必这样做。

您的第二个项目是完全独立的 Web 应用程序吗?

如果是这样,那么您需要注册它需要的所有组件。所以添加 DBContext。

如果不是,即。如果它是一个带有控制器和视图的引用项目,这些控制器和视图将通过其引用包含在主项目中。然后,您需要将其视为主要 Web 托管应用程序的一个模块。这样您就不会有另一个 Startup 类,也不需要注册任何服务。相反,您将能够通过第一个容器及其接口访问任何服务。

如果第二个项目有需要注册到容器中的服务,那么您将需要一些方法来执行此操作,例如 IServiceCollection 上的扩展方法,以便可以在主 ConfigureServices 方法中调用它。

public static void RegisterSecondProjectModule(this IServiceCollection services)
{
    // register your services here
    services.AddScoped...
}

// then in your main ConfigureServices method:
services.RegisterSecondProjectModule();

注意:对于您希望在解决方案中的两个/所有项目中都可用的任何服务,将界面移动到两个都可以引用的单独项目中是有意义的。我通常会创建一个名称后缀为.Abstractions 的项目,并更改默认命名空间以将其排除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 2022-06-28
    • 2020-06-04
    • 2023-02-03
    • 2023-03-08
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多