zoukankan      html  css  js  c++  java
  • .net core 在扩展中使用接口实例之IServiceProvider

    在.net core 2.0中,我们使用的对象实例大多数都是通过构造函数依赖注入进来的,但那是在一般的类中使用。

    如果需要在静态/扩展类中使用某些服务类的对象实例,可以使用如下方式:

    1、新建一个ServiceLocator,包含一个IServiceProvider的静态对象实例,如下:

     public class ServiceLocator
        {
            public static IServiceProvider Services { get; private set; }
    
            public static void SetServices(IServiceProvider services)
            {
                Services = services;
            }
        }

    2、在Startup类的Configure方法中,通过方法注入的方式,将系统的IServiceProvider装载进刚刚创建的ServiceLocator.Services中:

    public void Configure(IApplicationBuilder app, HostingEnvironment env, IServiceProvider serviceProvider)
     {
            ServiceLocator.SetServices(serviceProvider);
     }

    3、使用方式:

     public static partial class Extension{
            public static bool IsLogin(this Guid userId)
            {
                bool rc = false;
    
                //直接获取某个接口服务类的实例
                var userService = ServiceLocator.Services.GetService(typeof(IUserService)) as IUserService;         
                GetSysUserInfoOutDto userInfo = userService.GetUserInfo(userId);
                rc = userInfo != null;
    
                return rc;
            }
        }

    4、注意事项

    服务定位的IServiceProvider不要装载IApplicationBuilder的ApplicationServices对象实例,因为ApplicationServices获取不了Scope作用域的接口服务类实例。

    不要像下面这样装载,否则获取不了Scope作用域的接口服务类实例:

    ServiceLocator.SetServices(app.ApplicationServices);
  • 相关阅读:
    MySQL数据库:数据完整性及约束的应用
    MySQL数据库:运算符
    MySQL数据库:合并结果集
    MySQL数据库:聚合函数的使用
    spring web mvc环境搭建
    golang中type常用用法
    有些事情,你真的要早点明白
    一个小事例,了解golang通道阻塞模式
    golang中,slice的几个易混淆点
    作为面试官的一点小感想
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9035242.html
Copyright © 2011-2022 走看看