依賴注入輔助工具 Scrutor

.NET Core2.2 簡化的依賴注入 Scrutor 官方網站介紹

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

Scrutor:

普通注入

手動管理依賴關係注入過於繁瑣。當存在多個無法統一注入的存儲庫和服務時,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()
      );
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GRZpVy2LVVPmJwCnGS84mA