依赖注入辅助工具Scrutor

依赖注入辅助工具Scrutor

依赖注入辅助工具Scrutor

.NET Core2.2 简化的依赖注入 Scrutor官方网站介绍.

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

Scrutor:

  • 开源地址 https://github.com/khellang/Scrutor
  • 参考文档 https://www.cnblogs.com/catcher1994/p/10316928.html

普通注入

手动管理依赖关系注入过于繁琐。当存在多个无法统一注入的存储库和服务时,Scrutor 可以帮助我们简化 ASP.NET Core 的DI注册。

在 ConfigServices 中,我们需要以这种方式注入仓储、服务和其他接口和实现。当有多个仓储时,就很麻烦了。

services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IUserService, UserService>();
services.AddTransient<ICurrentUser, CurrentUser>();

服务后缀注入

当我们有具有多个服务后缀的服务时,我们可以使用以下方法来扫描服务,只留下以Service结尾的类,注册它们的类型以提供所有公共接口生成服务,并且它们的生命周期是瞬态的,

services.Scan(scan => scan
        .FromAssemblyOf<Startup>()
        .AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)))
        .AsImplementedInterfaces()
        .WithTransientLifetime()
         );

继承接口注入

此处以瞬时服务举例,创建一个新的空接口,当其他类继承此ITransientDependency接口时,将其统一注入 DI 以实现瞬态生命周期。

    public interface ITransientDependency
    {
    }

业务接口

public interface ICurrentUser
{
    int? Id { get; }

    int? GroupId { get; }

    bool? IsAdmin { get; }
}

模拟实现

 public class CurrentUser : ICurrentUser, ITransientDependency
    {
     
        public int? Id => 1;
        public int? GroupId => 2;
        public bool? IsAdmin => true;
    }

扫描继承 ITransientDependency 的所有实现。

services.Scan(scan => scan
        .FromAssemblyOf<ITransientDependency>()
        .AddClasses(classes => classes.AssignableTo<ITransientDependency>())
        .AsImplementedInterfaces()
        .WithTransientLifetime()
         );

使用

在其他类中使用此接口

[ApiController]
[Route("api/user")]
public class UserController : ControllerBase
{
    private readonly ICurrentUser _currentUser;

    public UserController(ICurrentUser currentUser)
    {
        _currentUser = currentUser;
    }

    [HttpGet]
    public int GetUser()
    {
        return _currentUser.Id;
    }
}

统一注入

当然,我们可以统一注入,而不是编写第二个服务。扫描

services.Scan(scan => scan
            .FromAssemblyOf<Startup>()
            .AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service",StringComparison.OrdinalIgnoreCase)))
            .AsImplementedInterfaces()
            .WithTransientLifetime()
            .FromAssemblyOf<ITransientDependency>()
            .AddClasses(classes => classes.AssignableTo<ITransientDependency>())
            .AsImplementedInterfaces()
            .WithTransientLifetime()
      );

其他几种注入类似再不赘述