依赖注入辅助工具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 中,我们需要以这种方式注入仓储、服务和其他接口和实现。当有多个仓储时,就很麻烦了。
代码语言:javascript复制services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IUserService, UserService>();
services.AddTransient<ICurrentUser, CurrentUser>();
服务后缀注入
当我们有具有多个服务后缀的服务时,我们可以使用以下方法来扫描服务,只留下以Service结尾的类,注册它们的类型以提供所有公共接口生成服务,并且它们的生命周期是瞬态的,
代码语言:javascript复制services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)))
.AsImplementedInterfaces()
.WithTransientLifetime()
);
继承接口注入
此处以瞬时服务举例,创建一个新的空接口,当其他类继承此ITransientDependency接口时,将其统一注入 DI 以实现瞬态生命周期。
代码语言:javascript复制 public interface ITransientDependency
{
}
业务接口
代码语言:javascript复制public interface ICurrentUser
{
int? Id { get; }
int? GroupId { get; }
bool? IsAdmin { get; }
}
模拟实现
代码语言:javascript复制 public class CurrentUser : ICurrentUser, ITransientDependency
{
public int? Id => 1;
public int? GroupId => 2;
public bool? IsAdmin => true;
}
扫描继承 ITransientDependency 的所有实现。
代码语言:javascript复制services.Scan(scan => scan
.FromAssemblyOf<ITransientDependency>()
.AddClasses(classes => classes.AssignableTo<ITransientDependency>())
.AsImplementedInterfaces()
.WithTransientLifetime()
);
使用
在其他类中使用此接口
代码语言:javascript复制[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;
}
}
统一注入
当然,我们可以统一注入,而不是编写第二个服务。扫描
代码语言:javascript复制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()
);
其他几种注入类似再不赘述