【问题标题】:.Net Core WebApi Dependency Injection.Net Core WebApi 依赖注入
【发布时间】:2021-02-02 06:41:00
【问题描述】:

我有一个解决方案,其中有不同的项目。 其中之一是api项目,我想在这个项目中使用依赖注入,但出现以下错误:

无法构造某些服务(验证服务描述符“ServiceType:CCM.Business.Abstract.ICompanyService Lifetime:Scoped ImplementationType:CCM.Business.Concrete.CompanyManager”时出错:无法解析“CCM”类型的服务.DataAccess.Concrete.CompanyDal',同时尝试激活'CCM.Business.Concrete.CompanyManager'。)

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddScoped<ICompanyDal, CompanyDal>();

        services.AddScoped<ICompanyService, CompanyManager>();
        
        
    }

ICompanyDal:

    public interface ICompanyDal: IGenericDal<Company>
{
}

公司达尔:

    public class CompanyDal:GenericDal<Company,CCMContext>,ICompanyDal
{
}

ICompanyService:

    public interface ICompanyService
{
    Company GetById(int id);
    List<Company> GetAll();
    void Create(Company entity);
    void Update(Company entity);
    void Delete(Company entity);
}

公司经理:

public class CompanyManager : ICompanyService
{
    private CompanyDal _companyDal;
    public CompanyManager(CompanyDal companyDal)
    {
        _companyDal = companyDal;
    }

    public void Create(Company entity)
    {
        _companyDal.Create(entity);
    }

    public void Delete(Company entity)
    {
        _companyDal.Delete(entity);
    }

    public List<Company> GetAll()
    {
        return _companyDal.GetAll();
    }

    public Company GetById(int id)
    {
        return _companyDal.GetById(id);
    }

    public void Update(Company entity)
    {
        _companyDal.Update(entity);
    }
}

我还有什么要告诉你的吗?请帮忙。

【问题讨论】:

    标签: asp.net-core dependency-injection asp.net-core-webapi


    【解决方案1】:

    更改CompanyManager 以显式依赖已注册的抽象

    公司经理

    //...
    
    private ICompanyDal _companyDal;
    //CTOR
    public CompanyManager(ICompanyDal companyDal) {
        _companyDal = companyDal;
    }
    
    //...
    

    因为这是在容器中注册的内容

    启动:

    //...
    
    services.AddScoped<ICompanyDal, CompanyDal>();
    
    //...
    

    确保您的控制器遵循类似的格式并明确依赖于已注册的抽象

    控制器:

    //...
    
    public MyController(ICompanyService service) {
        //...
    }
    
    //...
    

    【讨论】:

      【解决方案2】:

      在启动时,添加服务ICompanyDal 和实现CompanyDal。但是在CompanyManager 中,您注入的是实现CompanyDal,而不是服务ICompanyDal

      解决办法,在构造函数中注入服务:

      public class CompanyManager : ICompanyService
      {
          private ICompanyDal _companyDal;
          public CompanyManager(ICompanyDal companyDal)
          {
              _companyDal = companyDal;
          }
      ...
      

      【讨论】:

        猜你喜欢
        • 2018-07-13
        • 2016-05-22
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 2018-03-03
        • 2021-07-15
        相关资源
        最近更新 更多