使用 Scrutor 自动依赖注入

问题描述

我的项目中有许多服务,并尝试使用 Scrutor 进行自动 DI,而不是在 startup.cs 上手动注册每个服务

BarService.cs

public class BarService : IBar
    {
        public Bar Get(int id)
        {
            var bar = new Bar
            {
                bar_date = DateTime.UtcNow,bar_name = "bar"
            };
            return bar;
        }

        public List<Bar> GetMany()
        {
            List<Bar> list = new List<Bar>
            {
                new Bar
                {
                    bar_date = DateTime.UtcNow,bar_name = "bar 1"
                },new Bar
                {
                    bar_date = DateTime.UtcNow,bar_name = "bar 2"
                }
            };

            return list;
        }
    }

IBar.cs

public interface IBar
    {
        Bar Get(int id);
        List<Bar> GetMany();
    }

Bar.cs

public class Bar
    {
        public string bar_name { get; set; }
        public DateTime bar_date { get; set; }
    }

BarController.cs

[Route("api/[controller]")]
    [ApiController]
    public class BarController : ControllerBase
    {
        public IBar _service { get; set; }

        public BarController(IBar service)
        {
            _service = service;
        }

        [HttpGet("{id:int}")]
        public IActionResult Get(int id)
        {
            var result = _service.Get(id);
            if (result != null)
            {
                return Ok(result);
            }
            return NotFound("No data found");
        }


        [HttpGet]
        public IActionResult GetMany()
        {
            var result = _service.GetMany();
            if (result != null)
            {
                return Ok(result);
            }
            return NotFound("No data found");
        }

    }

services.AddScoped<IBar,BarService>(); 添加到 Startup.cs 工作正常,但不适用于 scrutor自动映射。

     services.Scan(scan =>
                    scan.FromCallingAssembly()
                        .AddClasses()
                        .AsMatchingInterface());

出现错误

error

解决方法

@Vikash Rathee,你可以试试AsImplementedInterfaces()。它将每个匹配的具体类型注册为其所有已实现的接口。

         services.Scan(scan =>
                        scan.FromCallingAssembly()
                            .AddClasses()
                            .AsImplementedInterfaces());

结果如下所示。

enter image description here

,

您目前正在使用 AsMatchingInterface(),其中

注册符合标准命名约定的服务

这将适用于如下匹配。

public class BarService : IBarService

在你的例子中

public class BarService : IBar

不遵循该约定,因此不会提供您预期的行为

因此,要么重构您的接口,以遵循 Scrutor 预期的抽象和实现之间的命名约定,

或者使用AsImplementedInterfaces(),其中

将一个实现注册为所有实现的接口

但是请注意,除非提供生命周期,否则默认情况下这会将这些接口注册为单例。

我建议将它们注册为作用域。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...