在通用类中注入依赖性的错误



我有一个类和通用接口,试图注入错误时:

system.argumentException:'无法实例化实现类型 'application.process.processintegrationusecase.genericclass.handlermanager 1[T]' for service type 'Application.Process.ProcessIntegrationUseCase.GenericClass.IHandlerManager 1 [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);
    }
}

Depeedency Injection

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;
            }
        }
     }
}

覆盖方法中的方法的类

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>是抽象的,您无法创建它的实例。

最新更新