net core 依懒注入 中间件

依懒注入

  依懒

 当一个类需要另一个类协作来完成工作的时候就产生了依。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。其中的登录我们由EF结合Idnetity来完成,所以我们封装了一个EFLoginService。这里AccountController就有一个ILoginService的依

 

这里有一个设计原则:依于抽象,而不是具体的实现。所以我们给EFLoginService定义了一个接口,抽象了LoginService的行为。

 

注入

注入体现的是一个IOC(控制反转的的思想)

控制反转

为了在业务变化的时候尽少改动代码可能造成的问题。
比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。这个时候我们只需要在原来注入的地方改一下就可以了。

 

 

NetCore依懒注入

  • Transient: 每一次GetService都会创建一个新的实例
  • Scoped:  在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
  • Singleton :整个应用程序生命周期以内只创建一个实例

不在构造函数获取依赖注入

  这个需求很常见。就比如我一个静态类 或者就不想在构造函数里面获取

  加一个全局的自己的容器

public class ServiceContainer
    {
        private static IServiceProvider serviceProvider { get; set; }

        public static IServiceProvider ServiceProvider
        {
            set { serviceProvider = value; }
        }

        public static T GetService<T>() where T : class
        {
            var scope = serviceProvider.CreateScope();
            return scope.ServiceProvider.GetRequiredService<T>();
        }
    }

 程序启动把服务都放到这个里面去

 

public class Program
    {
        public static void Main(string[] args)
        {
            var hosts = BuildWebHost(args);
            ServiceContainer.ServiceProvider = hosts.Services;
            hosts.Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }

 使用

 

var transitionService = ServiceContainer.GetService<ITransitionService>();

 

posted @ 2019-04-16 18:05  龙浩地府  阅读(329)  评论(0编辑  收藏  举报