首页 > 解决方案 > 使用 Scrutor 自动进行依赖注入

问题描述

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

酒吧服务.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();
    }

酒吧.cs

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

酒吧控制器.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());

我收到错误

错误

标签: c#asp.net-coreasp.net-web-apiscrutor

解决方案


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

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

结果如下所示。

在此处输入图像描述


推荐阅读