DependencyResolutionException:在类型上找不到带有“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数

如何解决DependencyResolutionException:在类型上找不到带有“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数

它在添加类似于 actionedServicerejectionService 之前工作较早,引发以下错误

处理请求时发生未处理的异常。 DependencyResolutionException:在类型 'Sx.Workflow.Server.Controllers.ReportController' 上找到的带有 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 的构造函数都不能用可用的服务和参数调用: 无法解析构造函数 'Void .ctor(NLog.ILogger,AutoMapper.IMapper,Sx.Workflow.Reporting.Services.IRejectionService,Sx.Workflow.Reporting.Services.IActionedService) 的参数 'Sx.Workflow.Reporting.Services.IActionedService actionedService' '。 Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(ConstructorInfo[] availableConstructors,IComponentContext context,IEnumerable parameters) in ReflectionActivator.cs,line 160

控制器

namespace Sx.Workflow.Server.Controllers
{
    [MenuItem("report")]
    [ServiceFilter(typeof(SettingsFilter))]
    [Authorize(Policy = Security.Constants.RolePolicy)]
    public class ReportController : Controller
    {
        private readonly ILogger _logger;
        private readonly IMapper _mapper;
        private readonly IRejectionService _rejectionService;
        private readonly IActionedService _actionedService;

        public ReportController(ILogger logger,IMapper mapper,IRejectionService rejectionService,IActionedService actionedService)
        {
            _logger = logger;
            _mapper = mapper;
            _rejectionService = rejectionService;
            _actionedService = actionedService;
        }

        [HttpGet]
        public IActionResult Index()
        {
            _logger.Info("Report Controller");
            return View();
        }

        [HttpPost]
        [ApiExceptionFilter]
        public async Task<IActionResult> Reject(RejectionReportRequestDto criteria)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _logger.Info("Generate Rejection Report");
            var result = await _rejectionService.Generate(criteria.From,criteria.To);
            var items = _mapper.Map<RejectionReportDto>(result);
            return Ok(items);
        }

        [HttpPost]
        [ApiExceptionFilter]
        public async Task<IActionResult> Actioned(ActionedReportRequestDto criteria)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _logger.Info("Generate Actioned Report");
            var result = await _actionedService.Generate(criteria.From,criteria.To);
            var items = _mapper.Map<ActionedReportDto>(result);
            return Ok(items);
        }
    }
}

处理程序

namespace Sx.Workflow.Reporting.Handlers
{
    public class ActionedReportHandler : IHandleEvent<ApplicationActionedEvent>
    {
        private readonly IActionedService _service;

        public ActionedReportHandler(IActionedService service)
        {
            _service = service;
        }

        public Task Handle(ApplicationActionedEvent args)
        {
            var actioned = new Actioned
            {
                ApplicationNumber = args.ApplicationNumber,AssigneeFrom = args.AssigneeFrom,Assigneeto = args.Assigneeto,DepartmentFrom = args.DepartmentFrom.Name,DepartmentTo = args.DepartmentTo.Name,Reason = args.RejectReasonName,Comments = args.RejectReasonText,RejectionDate = DateTime.Now
            };

            return _service.Save(actioned);
        }
    }
}

服务

namespace Sx.Workflow.Reporting.Services
{
    public class ActionedService : IActionedService
    {
        private readonly ISaveActioned _saveActioned;
        private readonly IGenerateActionedReport _actionedReport;

        public ActionedService(ISaveActioned saveActioned,IGenerateActionedReport actionedReport)
        {
            _saveActioned = saveActioned;
            _actionedReport = actionedReport;
        }

        public Task<ActionedReport> Generate(DateTime from,DateTime to)
        {
            return _actionedReport.Generate(from,to);
        }

        public Task Save(Actioned actioned)
        {
            return _saveActioned.Save(actioned);
        }
    }
}

界面

namespace Sx.Workflow.Reporting.Services
{
    public interface IActionedService
    {
        Task Save(Actioned actioned);
        Task<ActionedReport> Generate(DateTime from,DateTime to);
    }
}

服务模块

public class ServiceModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<RejectionService>()
            .As<IRejectionService>()
            .InstancePerLifetimeScope();

        builder.RegisterType<ActionedService>()
            .As<IActionedService>()
            .InstancePerLifetimeScope();
    }
}

解决方法

有道理。当您在 DI 中注册类型时,您没有任何用途:

        public ActionedService(ISaveActioned saveActioned,IGenerateActionedReport actionedReport)

所以 autofac 假设 ActionedService 中必须有一个空的构造函数

所以有两种解决方案:

  1. 移除构造函数参数并在没有 DI 的情况下创建它们
  2. 为构造函数的两个参数创建注册。类似于以下内容:
protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<RejectionService>()
            .As<IRejectionService>()
            .InstancePerLifetimeScope();

        builder.RegisterType<ActionedService>()
            .As<IActionedService>()
            .InstancePerLifetimeScope();

        builder.RegisterType<SaveActioned>()
            .As<ISaveActioned>()
            .InstancePerLifetimeScope();

        builder.RegisterType<GenerateActionedReport>()
            .As<IGenerateActionedReport>()
            .InstancePerLifetimeScope();
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?