这是为了一个学习项目.当派生类在其构造函数中调用base(参数)时,如何才能将IHttpContextAccessor
或任何类注入基本服务类而不将其注入派生类?
我试图避免将依赖项添加到它们的构造函数中的所有派生类,因为它们不会使用它.我有一个基地服务班级:
type namespace MagicVilla_Web.Services
{
public class BaseService : IBaseService
{
public IHttpClientFactory httpClient { get; set; }
public APIResponse responseModel { get; set; }
** public IHttpContextAccessor httpContextAccessor;** // <== I want to inject this in this class
public BaseService(IHttpClientFactory httpClient)
{
this.responseModel = new();
this.httpClient = httpClient;
}
public async Task<T> SendAsync<T>(APIRequest apiRequest)
{
// do a bunch of stuff
}
}
以及从BaseService类继承但在其构造函数中显式调用BaseService的派生类.SendAsync<;T>;函数的公共业务逻辑在BaseService类中,这就是我希望将IHttpConextAccessor注入BaseService类的原因.
每当我注入和调用这些派生服务类时,它们都会使用1个参数调用base Service构造函数,而我似乎找不到一种让依赖项注入工作的方法
namespace MagicVilla_Web.Services
{
public class AuthService : BaseService, IAuthService
{
private readonly IHttpClientFactory _clientFactory;
private string villaUrl;
public AuthService(IHttpClientFactory clientFactory, IConfiguration configuration) : base(clientFactory)
{
_clientFactory = clientFactory;
villaUrl = configuration.GetValue<string>("ServiceUrls:VillaAPI");
}
public Task<T> RegisterAsync<T>(RegistrationRequestDTO obj)
{
return SendAsync<T>(new APIRequest()
{
//call base class SendAsync with arguments
});
}
从BaseService继承的另一个服务类
namespace MagicVilla_Web.Services
{
public class VillaService : BaseService, IVillaService
{
private readonly IHttpClientFactory _clientFactory;
private string villaUrl;
public VillaService(IHttpClientFactory clientFactory, IConfiguration configuration) : base(clientFactory)
{
_clientFactory = clientFactory;
villaUrl = configuration.GetValue<string>("ServiceUrls:VillaAPI");
}
public Task<T> CreateAsync<T>(VillaCreateDTO dto)
{
return SendAsync<T>(new APIRequest()
{
//call base class SendAsync with arguments
});
}
我try 将多个构造函数添加到基类,但这不起作用,因为基类从不直接调用,其方法仅通过派生类调用,因此双参数构造函数不起作用.
type namespace MagicVilla_Web.Services
{
public class BaseService : IBaseService
{
public IHttpClientFactory httpClient { get; set; }
public APIResponse responseModel { get; set; }
public IHttpContextAccessor httpContextAccessor;
public BaseService(IHttpClientFactory httpClient,IHttpContextAccessor httpContextAccessor ) // <== does not work
{
this.responseModel = new();
this.httpClient = httpClient;
this.httpContextAccessor = httpContextAccessor;
}
public BaseService(IHttpClientFactory httpClient)
{
this.responseModel = new();
this.httpClient = httpClient;
}
}
如果我将注入类添加到所有派生构造函数及其对基类的调用中,那么注入确实有效,但这似乎很难维护.
AuthService(IHttpClientFactory clientFactory, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(clientFactory, httpContextAccessor)
VillaService(IHttpClientFactory clientFactory, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(clientFactory, httpContextAccessor)
My Program.cs中的所有内容都应正确设置.我不会在任何地方注入BaseService类.
builder.Services.AddScoped<IVillaService, VillaService>();
builder.Services.AddScoped<IVillaNumberService, VillaNumberService>();
builder.Services.AddScoped<IAuthService, AuthService>();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();```
有没有某种方法可以在不更改派生类的构造函数的情况下将IHttpConextAccessor注入BaseService类中?
我查看了文档,没有看到任何特别引用此用例的内容.https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection-usage个