前言:
此刻朋友们对“net依赖注入”大概比较关切,各位老铁们都需要剖析一些“net依赖注入”的相关内容。那么小编在网上网罗了一些关于“net依赖注入””的相关资讯,希望姐妹们能喜欢,各位老铁们快快来了解一下吧!问题
Error to inject dependency in generic class
我有一个类和泛型接口,当尝试注入时发生错误:
System.ArgumentException: ‘Cannot instantiate implementation type
‘Application.Process.ProcessIntegrationUseCase.GenericClass.HandlerManager1[T]’
for service type
‘Application.Process.ProcessIntegrationUseCase.GenericClass.IHandlerManager1[T]’.’
namespace Application.Process.ProcessIntegrationUseCase.GenericClass{ public abstract class HandlerManager<T>: IHandlerManager<T> { protected IHandlerManager<T> sucessor; public void SetSucessor(IHandlerManager<T> sucessor) { this.sucessor = sucessor; } public abstract void ProcessRequest(T request); }}
接口 IHandlerManager
namespace Application.Process.ProcessIntegrationUseCase.GenericClass{ public interface IHandlerManager<T> { void SetSucessor(IHandlerManager<T> sucessor); void ProcessRequest(T request); }}
依赖注入
public void Register(IServiceCollection services){ // Injection History Use Cases Application services.AddTransient(typeof(IHandlerManager<>), typeof(HandlerManager<>));}
调用已注入 HandlerManager 的代码
using Domain.Meta;using System;using Microsoft.Extensions.Logging;using Application.Process.ProcessIntegrationUseCase.GenericClass;namespace Application.UseCases.Process.ProcessIntegrationUseCase.Habitacional{ public sealed class ProcessHabitacionalUseCase : IProcessHabitacionalUseCase { private readonly StartProcessHandler<HistoryHabitacional> _startProcessHandler; private readonly ILogger _iLogger; public ProcessHabitacionalUseCase(ILogger iLogger, StartProcessHandler<HistoryHabitacional> startProcessHandler) { _iLogger = iLogger; _startProcessHandler = startProcessHandler; } public void Execute(HistoryHabitacional history) { if (history == null) throw new ArgumentNullException(); try { _startProcessHandler.ProcessRequest(history); } catch (Exception ex) { throw ex; } } }}
重写HandlerManager 中方法的类StartProcessHandler
using System;using System.Reflection;using Microsoft.Extensions.Logging;using Application.Repositories.History;using Application.Repositories.I4Pro;using Domain.Process.Enum;namespace Application.Process.ProcessIntegrationUseCase.GenericClass{ public class StartProcessHandler<T> : HandlerManager<T> where T: class { private readonly ILogger _iLogger; private readonly IHistoryReadOnlyRepository _historyReadOnlyRepository; private readonly II4ProReadOnlyRepository _i4ProReadOnlyRepository; public StartProcessHandler(ILogger iLogger, IHistoryReadOnlyRepository historyReadOnlyRepository, II4ProReadOnlyRepository i4ProReadOnlyRepository) { _iLogger = iLogger; _historyReadOnlyRepository = historyReadOnlyRepository; _i4ProReadOnlyRepository = i4ProReadOnlyRepository; } public override void ProcessRequest(T history) { try { TypeIntegration typeIntegration = (TypeIntegration)history.GetType().GetProperty("TypeIntegration").GetValue(history); _iLogger.LogInformation("Buscando execuções MetaIntegra"); var item = _historyReadOnlyRepository.GetLastHistory(typeIntegration); _iLogger.LogInformation("Buscando execuções I4Pro"); var i4Process = _i4ProReadOnlyRepository.ListLastExecutions(); _iLogger.LogInformation("Executing Habitacional Integration_" + DateTime.Now.ToString()); if ((item != null && i4Process[0].Id_Processo_Log != item.LastIdI4Pro) || item == null) { history.GetType().GetProperty("LastIdI4Pro").SetValue(history, item.LastIdI4Pro); history.GetType().GetProperty("IdProcessoLog").SetValue(history, i4Process[0].Id_Processo_Log); if (base.sucessor != null) sucessor.ProcessRequest(history); } } catch (Exception ex) { _iLogger.LogError(ex.Message); } } }}答案
您不能像这样使用泛型类型。AddTransient() 期望可以将指定的第二种类型的实例分配给对第一种类型的引用。泛型HandlerManager<> 不可分配给 IHandlerManager<>; 您需要指定隐式类型并以一致的方式进行。
此外,HandlerManager<T> 是抽象的,您无法创建它的实例。
标签: #net依赖注入