龙空技术网

ASP.Net Core中泛型类依赖注入出错

全栈音乐 323

前言:

此刻朋友们对“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依赖注入