【发布时间】: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
这个实现并没有那么重,我无法通过将 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