我有一個名為IBaseService的基礎介面,我在許多類中實作了它,我想注入所有實作IBaseService的類。
下面是我的代碼的一個例子:
public interface IBaseService
{
Task<bool> Create();
}
public class EstadoService : IBaseService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
private readonly IRepository<Estado> _repository;
公共EstadoService()
{
}
public EstadoService(IUnitOfWork unitOfWork, IMapper mapper, IRepository< Estado> repository)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
_repository = repository;
}
public async Task<bool> Create()
{
// 創建邏輯
}
}
公共靜態物件 AddServices(this IServiceCollection services)
{
/*
typeof(IBaseService).Assembly.GetTypes()
.Where(mytype => mytype.GetInterface(typeof(IBaseService).Name)!
null).ToList().ForEach(appCoreService =>
services.AddScoped(Activator.CreateInstance(appCoreService,) ))。
*/
var items = typeof(IBaseService).Assembly.GetTypes()
.Where(x => !x.IsAbstract && x.IsClass & &
x.GetInterface(nameof(IBaseService)) == typeof(IBaseService))。
foreach (var item in items)
{
string _name = item.FullName;
Type t = Type.GetType(_name);
var instance = (IBaseService) Activator.CreateInstance(t);
services.Add(new ServiceDescriptor(typeof(IBaseService), instance, ServiceLifetime.Scoped))。
}
回傳服務。
}
public class EstadoController : BaseApiController
{
private readonly IEstadoService _estado;
公共EstadoController(IEstadoService estado)
{
_estado = estado;
}
[HttpPost("add-estado")] 。
public async Task<ActionResult> AddEstado(EstadoRegisterDto registerEstadoDto)
{
await _estado.Create(registerEstadoDto);
回傳Ok()。
}
它看起來很好,但它不作業。
uj5u.com熱心網友回復:
對于注冊操作,修復它有點像這樣
//啟動時注冊
var items = typeof(IBaseService).Assembly.GetTypes()
.Where(x => !x.IsAbstract && x.IsClass & &
x.GetInterface(nameof(IBaseService)) == typeof(IBaseService)).ToArray()。
foreach (var item in items)
{
services.Add(new ServiceDescriptor(typeof(IBaseService), item, ServiceLifetime.Scoped))。
}
// 使用
public IActionResult TestInjection([FromServices] IEnumerable<IBaseService> estadoService)
{
// 在這里放置一個除錯器來查看結果
var allImplementedServices = estadoService.ToArray();
}
uj5u.com熱心網友回復:
正如我所看到的,你只是想把繼承了IBaseService介面的服務添加到依賴注入中。
在非動態的情況下,將服務添加到依賴注入中,你必須這樣做:
services
services.AddScoped<IEstadoService, EstadoService>()。
如果你在你的代碼中這樣放,這將不會作業,因為EstadoService沒有實作IEstadoService,并且class和interface沒有關系。
在你的控制器中,為了訪問服務,你注入了IEstadoService,所以,為了讓它作業,你首先需要做的是:
在IEstadoService中繼承自IBaseService,像這樣:
public interface IEstadoService: IBaseService
{
//這里的代碼...
}
而在EstadoService中,像這樣繼承自IEstadoService:
public class EstadoService: IEstadoService
{
//這里的代碼...
}
在這種情況下,你可以像這樣動態地添加依賴性注入:
公共靜態物件AddServices(this IServiceCollection services)
{
var list = Assembly.GetExecutingAssembly().GetTypes()
.Where(mytype => mytype.GetInterface(typeof(IBaseService).Name) != null & & !mytype.IsInterface)
.ToList()。
foreach (var item in list)
{
services.AddScoped(item.GetInterface($"I{item.Name}"), item)。
}
回傳服務。
}
裝配串列將有所有繼承IBaseService的服務,在這種情況下,串列將有EstadoService。
由于在foreach回圈中的item是一個型別,我們可以呼叫item.GetInterface($"I{item.Name}")這將導致interface物件的型別為IEstadoService
像這樣,它將對所有實作IBaseService的服務起作用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311773.html
標籤:
