zoukankan      html  css  js  c++  java
  • 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>();
  • 相关阅读:
    十六、异步编程——messagedialog
    关于委托的一个摘录
    com interop 简述
    [STAThread]的使用
    Python初识和基础语法
    Python基础数据类型以及格式化输出
    JS读取PHP中设置的中文cookie时出现乱码的解决方法
    解决跨域读写Cookies的问题,(ASP、PHP、ASP.NET、JSP)解决方案
    多字段distinct查询
    Dedecms当前位置{dede:field name='position'/}修改,去掉>方法
  • 原文地址:https://www.cnblogs.com/zhaops/p/10718838.html
Copyright © 2011-2022 走看看