.Net Core自身提供了一套简单的DI框架,能满足我们DI基本的需求。它依赖以下组件,需要从Nuget包下拉取。

    Microsoft.Extensions.DependencyInjection.Abstractions

  其中有2个比较重要的对象,ServiceCollection和ServiceProvider。前者是DI容器,代表这个各个服务实例的集合,提供了一些基本注入方式,如下示例

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 
       //任意一个ServiceProvider下取得的实例都相同 
            services.AddSingleton<IBookDAL, MemoryBookDAL>();
       //每一次从ServiceProvider取得,均返回一个新的实例 
            services.AddTransient<IBookDAL2, MemoryBookDAL2>();
       //在同一作用域下生成的实例相同,即同一个ServiceProvider下取得的实例相同 
            services.AddScoped<IBookDAL3, MemoryBookDAL3>();
            
       //获取Service
       var s= services.BuildServiceProvider().GetService<IBookDAL>();  
        }

  后者负责Service实例的维护,包括创建和销毁。这个对象也提供了集成第三方组件的扩展点。可以由IServiceCollection接口的扩展方法BuildServiceProvider得到它。

  这就是.Net Core自身的DI框架的一些基本情况,使用很简单。在日常开发过程中,我们可能会用到一些专业性更高的DI组件,我们这里使用Autofac来尝试集成看看。

  首先Nuget包,别拉错了。

Autofac.Extensions.DependencyInjection

  集成方式如下,ConfigureServices方法需要返回 IServiceProvider。特别关注下 builder.Populate(services); 注释说明

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(cfg =>
            {
                var filter = ApplicationContainer.Resolve<DefaultExceptionFilterAttribute>();
                //var filter = services.BuildServiceProvider().GetService<DefaultExceptionFilterAttribute>();
                if (filter != null)
                    cfg.Filters.Add(filter);
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            var serviceProvider = AutoFacRegister(services);

            return serviceProvider;

        }

     public IContainer ApplicationContainer { get; private set; }

        public IServiceProvider AutoFacRegister(IServiceCollection services)
        {
            var builder = new ContainerBuilder();

            //very import
            //正常返回IServiceProvider 并不能替代原IServicePrivder。还需要自定义ServiceScopeFactory保证RequestServices返回的也是你自定义的ServiceProvider。
            //详细见https://www.cnblogs.com/artech/p/3rd-party-di-integration.html
            //此处autofac做了特殊处理
            builder.Populate(services);

            builder.RegisterType<MemoryBookDAL>().As<IBookDAL>().SingleInstance();
            builder.RegisterType<TestPermissionCheckService>().As<IPermissionCheckService>().SingleInstance();
            builder.RegisterType<PermissionCheckAuthorizationHandler>().As<IAuthorizationHandler>();
            builder.RegisterType<DefaultExceptionFilterAttribute>();

            builder.RegisterType<GlobalApiLoggingMiddleware>();
            builder.RegisterType<GlobalExceptionMiddleware>();

            ApplicationContainer = builder.Build();

            return new AutofacServiceProvider(ApplicationContainer);
        }

.Net Core 依赖注入手记的更多相关文章

  1. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  2. net core 依赖注入问题

    net core 依赖注入问题 最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久 ...

  3. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

  4. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  5. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  6. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

  7. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  8. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

  9. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

随机推荐

  1. ORs-6-Olfactory Bulb Ratio, ORs Gene Repertoire, and Olfactory Ability

    Olfactory Bulb Ratio, ORs Gene Repertoire, and Olfactory Ability 1.Olfactory Bulb的生物学意义:a.生存 b.嗅觉能力 ...

  2. axious设置携带cookie同时允许跨域的问题

    axious设置携带cookie同时允许跨域的问题

  3. [LC] 24. Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  4. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-发送测试报告邮件(19)

    给多个人发邮件时,可以传入邮箱列表 把多个收件人用分号隔开 # -*- coding: utf-8 -*-# @Time : 2020/2/15 17:02# @File : send_mail_19 ...

  5. highcharts 柱状图在柱子顶部显示y轴数据

    var plotOptions={ column:{ //borderColor: "#CCCC66",//边框 shadow: true, //阴影 dataLabels:{ / ...

  6. HDU-2511-汉诺塔 X

    首先我们来求第m次移动的盘子号数,先列出当m比较小可以直接观察的前几项 m : 1.2.3.4.5.6.7.8.9.10 id : 1.2.1.3.1.2.1.4.1.2 很容易联想到树状数组的low ...

  7. VRRP笔记一:基本简介(注意iptables和selinux的问题)

    LAN客户端判定哪个路由器应该为其到达目标主机的下一跳网关的方式有动态及静态决策两种方式,其中,觉的动态路由发现方式有如下几种: 1.Proxy ARP —— 客户端使用ARP协议获取其想要到达的目标 ...

  8. <JZOJ5937&luogu3944>斩杀计划&肮脏的牧师

    第一次写桶排相关题.... #include<cstdio> #include<iostream> #define rint register int template < ...

  9. Java正则表达式java.util.regex类的简单使用

    1.什么是正则表达式? 正则表达式(regular expression)是根据字符串集合内每个字符串共享的共同特性来描述字符串集合的一种途径.正则表达式可以用于搜索.编辑或者处理文本和数据. Jav ...

  10. Python爬虫-selenium的使用(2)

    使用selenium打开chrome浏览器百度进行搜索 12345678910111213141516171819202122232425 from selenium import webdriver ...