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