【问题标题】:.Net Core Dependency Injection and Class Inheritance.Net Core 依赖注入和类继承
【发布时间】:2021-04-16 20:01:17
【问题描述】:

大家好,首先让我感叹一下,我已经搜索了现有的问题,但没有任何结果。

如果我错过了解决这个特定问题的一个,请原谅我。此 .NET Core 3.1 Web API 使用解决方案中的另一个项目 ClassLibrary 来支持其 HTTP 动词方法。 ClassLibrary 中的一个类名为 Cars,它是从 ICars 继承的,可能只是为了 .NET Core 的默认依赖注入目的,但当然这是用于(构造函数注入)Controller CarController。

但是,还有另一个控制器 BlueCarsController 通过其接口 IBlueCars 使用 ClassLibrary BlueCars。请注意,接口公开了在各个类中实现的完全独立的、不同的方法。

我尝试正确注入继承的接口:

   services.AddScoped<IBlueCars, BlueCars>();

导致编译错误:

" 类型 'ModelsClassLibrary.BlueCars' 不能用作类型参数 'TImplementation' 在泛型类型或方法“ServiceCollectionServiceExtensions.AddScoped(IServiceCollection)”中。 没有从 'ModelsClassLibrary.BlueCars''ModelsClassLibrary.IBlueCars' 的隐式引用转换。 "

这个实现并没有那么重,我无法通过将 BlueCars 的功能组合到 Cars 类中来轻松解决这个问题,但让我们面对现实吧,它们毕竟是真正的“BlueCars”,这是不合适的。

我不欣赏降价,但谢谢

//---------------------class BlueCars--------------------------     
namespace ModelsClassLibrary
{
    public interface IBlueCars
    {
        Task<CallsListDto> GetBlueCarsAsync(string Id, int OtherId, string brand);
    }
    public class BlueCars : Cars
    {
        private readonly ILogger<IBlueCars> _logger;
        private readonly ISomeApiService _someWebApiService;        
        private readonly ICars _cars;        
        private readonly IBlueCars _blueCars;    
        private readonly IConfiguration _configuration;

        public BlueCars(ISomeApiService crmWebApiService,                            
                            ILogger<IBlueCars> logger,
                            ICars cars,
                            IConfiguration configuration,
                            IBlueCars _blueCars
                            )
        {
            _crmWebApiService = crmWebApiService;
            _logger = logger;
            _cars = cars;
            _configuration = configuration;
         
        }


        public async Task<Cars> GetBlueCarsAsync(
                                    string Id, 
                                    int OtherId, 
                                    string brand)        
        {
            var results = new List<Cars>();  
                // blah blah Do Stuff 
        }   
    }
}


//---------------------class Cars--------------------------     
namespace CrmDataAccess
{
    public interface ICars
    {
        Task<CarsListDto> GetCarsAsync(string user, string someBrand);
    }

    public class Cars: ICars
    {
        public const int Nopage = -1;       // Move to crmStringThingie
        private readonly ILogger<CallList> _logger;
        private readonly ICrmWebApiService _crmWebApiService;
        private readonly IConfiguration _configuration;

        public CallList(ICrmWebApiService crmWebApiService, ILogger<CallList> logger, IConfiguration configuration)
        {
            _logger = logger;
            _crmWebApiService = crmWebApiService;
            _configuration = configuration;
        }

        public async Task<Dictionary> GetCarsAsync(string user, string someBrand);
        {
            var result = new CarsListDto();

          // dance fly iterate harvest wash rinse repeat make cool stuff call a service whatever   tada!
          
            return result;  
        }
    }
    
}

//-------------------ConfigureServices

    public void ConfigureServices(IServiceCollection services)
        {           
            //  various config stuff authentication stuff ommitted 
            
              services.AddScoped<ICars, Cars>();   // Works fine for CarsController 
              
              services.AddScoped<IBlueCars, BlueCars>(); // Since BlueCars inherits from Cars how do you do this correctly ? 
                        // the interfaces expose completely different Get methods 
                        
              //---- Various Configure stuff Swagger stuff blah blah 
              
        }
            
            
//-------------------------------

namespace SomeWebApi.Controllers
{
    public class CarsController : BaseController // default logger implementation & other stuff 
    {
    
        private readonly ISomeService _someService;
        private readonly ICars _cars;

        public CallsController(ISomeService _someService,  ICars cars, ILogger<CallsController> logger) : base(_someService, logger)
        {
            _cars = cars;            
        }
        
        
    [HttpGet]
        public async Task<CarsListDto> GetAsync(string user, string someBrand)
        {
                CarsListDto results = await _cars.GetCarsAsync(user,someBrand);
                
                return result;  
            
        }
    }
}

//-------------------------------

namespace SomeWebApi.Controllers
{
    public class BlueCarsController : BaseController // default logger implementation & other stuff 
    {
    
        private readonly ISomeService _someService;
        private readonly IBlueCars _blueCars;

        public BlueCarsController(ISomeService _someService, IBlueCars blueCars, ILogger<CallsController> logger) : base(_someService, logger)
        {
            _blueCars = blueCars;            
        }
        
        
    [HttpGet]
        public async Task<CarsListDto> GetAsync(string id,string brand)
        {
                    // magically get parameters for GetAsync
                    
                CarsListDto results = await _blueCars.GetBlueCarsAsync(Id, OtherId,someBrand);
            
        }
    }
}
        
        
        
        
        
        
        
    

【问题讨论】:

  • 能否分享一下类和接口(BlueCars、Cars、ICars和IBlueCars)的相关代码?
  • 根据显示的代码,错误是准确的。 BlueCars 并非源自 IBlueCars

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


【解决方案1】:

根据显示的代码,错误消息是准确的。 BlueCars 不是从 IBlueCars 派生的

重构BlueCars 派生自IBlueCars 而不是Cars

public class BlueCars : IBlueCars {

    //...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2023-03-28
    • 2016-05-22
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    相关资源
    最近更新 更多