前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >依赖注入辅助工具Scrutor

依赖注入辅助工具Scrutor

作者头像
leon公众号精选
发布2022-04-27 16:19:10
4250
发布2022-04-27 16:19:10
举报

依赖注入辅助工具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()
      );

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师高级俱乐部 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖注入辅助工具Scrutor
    • 普通注入
      • 服务后缀注入
        • 继承接口注入
          • 业务接口
          • 模拟实现
          • 扫描继承 ITransientDependency 的所有实现。
          • 使用
          • 统一注入
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档