依賴注入輔助工具 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()
);
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/GRZpVy2LVVPmJwCnGS84mA