在.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);

 

 posted on 2018-05-14 11:29  F风  阅读(1001)  评论(0编辑  收藏  举报