(精华)2020年7月21日 ASP.NET Core 容器伪属性注入

举报
愚公搬代码 发表于 2021/10/18 22:57:50 2021/10/18
【摘要】 为 Controller 实现伪属性注入 Controller 默认是不会通过自带容器来 Resolve&Activate 的,是通过MVC自身管理的。可以通过调用 AddControllers...

为 Controller 实现伪属性注入

Controller 默认是不会通过自带容器来 Resolve&Activate 的,是通过MVC自身管理的。可以通过调用 AddControllersAsServices()方法来让 Controller 使用自带容器。

services.AddControllers().AddControllersAsServices();

  
 
  • 1

AddControllersAsServices源码如下
在这里插入图片描述
定义 Controller 基类
在这里插入图片描述
Controller 继承基类
在这里插入图片描述
改造 Controller 激活器
在这里插入图片描述
替换默认 Controller 激活器

services.AddControllers().AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, XcServiceBasedControllerActivator>()); //替换默认 Controller 激活器

  
 
  • 1
  • 2

在这里插入图片描述

为 Application Service 实现伪属性注入

只是以 Application Service 来作为讲解,同理可举一反三到其他地方。Application Service 属于领域驱动分层架构中的一层,如不了解,可自行查找资料。

  
 
  • 1

定义应用服务基类接口

public interface IAppService
{
    ILogger Logger { get; set; }
}

public class AppService:IAppService
{
    public ILogger Logger { get; set; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

定义具体服务,以 User 服务为例

public interface IUserAppService:IAppService
{
    void Create();
}

public class UserAppService : AppService,IUserAppService
{
    public void Create()
    {
        Logger.LogInformation("来自 Application Service 的日志");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

定义特殊的注册服务的方法,以便实现 Resolve 为 Logger 赋值

public static class ServiceExtensions
{
    public static IServiceCollection AddApplicationService<TService, TImpl>(this IServiceCollection services) where TService:IAppService where TImpl:AppService
    {
        services.AddApplicationService(typeof(TService), typeof(TImpl));
        return services;
    }
    // 可以反射程序集调用此方法实现批量自动注册应用服务
    public static IServiceCollection AddApplicationService(this IServiceCollection services, Type serviceType,Type implType)
    {
        services.AddTransient(serviceType, sp =>
        {
            //获取服务实现的实例
            var implInstance = ActivatorUtilities.CreateInstance(sp, implType); ;

            if (implInstance is AppService obj)
            {
                //为 Logger 赋值
                obj.Logger= sp.GetRequiredService<ILoggerFactory>().CreateLogger(implType);
            }
            
            return implInstance;
        });
        return services;
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

注册测试服务
在这里插入图片描述
在这里插入图片描述

文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。

原文链接:codeboy.blog.csdn.net/article/details/107491709

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。